diff --git a/include/actor.h b/include/actor.h index e8a7cf2..64c8066 100644 --- a/include/actor.h +++ b/include/actor.h @@ -14,7 +14,7 @@ #define ACTOR_STATE_MOVING_RIGHT 1 << 8 // 256 #define ACTOR_STATE_MOVING_UP 1 << 9 // 512 #define ACTOR_STATE_MOVING_DOWN 1 << 10 // 1024 -#define ACTOR_STATE_UNDEFINED_11 1 << 11 // 2048 +#define ACTOR_STATE_MOVING 1 << 11 // 2048 #define ACTOR_STATE_UNDEFINED_12 1 << 12 // 4096 #define ACTOR_STATE_UNDEFINED_13 1 << 13 // 8192 #define ACTOR_STATE_UNDEFINED_14 1 << 14 // 16384 @@ -54,7 +54,8 @@ typedef struct actor { int layer; b2BodyId physicsId; b2Polygon physicsBox; - int state; + int logicstate; + int visualstate; bool movement_controls_face; void *actorData; bool visible; diff --git a/lib_src/actor.c b/lib_src/actor.c index 7c57be0..a9edf75 100644 --- a/lib_src/actor.c +++ b/lib_src/actor.c @@ -58,15 +58,15 @@ ErrorContext *actor_automatic_face(actor *obj) ATTEMPT { if ( obj->movement_controls_face == true ) { // TODO : This doesn't really work properly - BITMASK_DEL(obj->state, ACTOR_STATE_FACE_ALL); - if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_LEFT) ) { - BITMASK_ADD(obj->state, ACTOR_STATE_FACE_LEFT); - } else if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_RIGHT) ) { - BITMASK_ADD(obj->state, ACTOR_STATE_FACE_RIGHT); - } else if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_UP) ) { - BITMASK_ADD(obj->state, ACTOR_STATE_FACE_UP); - } else if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_DOWN) ) { - BITMASK_ADD(obj->state, ACTOR_STATE_FACE_DOWN); + BITMASK_DEL(obj->visualstate, ACTOR_STATE_FACE_ALL); + if ( BITMASK_HAS(obj->logicstate, ACTOR_STATE_MOVING_LEFT) ) { + BITMASK_ADD(obj->visualstate, ACTOR_STATE_FACE_LEFT); + } else if ( BITMASK_HAS(obj->logicstate, ACTOR_STATE_MOVING_RIGHT) ) { + BITMASK_ADD(obj->visualstate, ACTOR_STATE_FACE_RIGHT); + } else if ( BITMASK_HAS(obj->logicstate, ACTOR_STATE_MOVING_UP) ) { + BITMASK_ADD(obj->visualstate, ACTOR_STATE_FACE_UP); + } else if ( BITMASK_HAS(obj->logicstate, ACTOR_STATE_MOVING_DOWN) ) { + BITMASK_ADD(obj->visualstate, ACTOR_STATE_FACE_DOWN); } } } CLEANUP { @@ -115,16 +115,16 @@ ErrorContext *actor_logic_movement(actor *obj, SDL_Time curtimems) PREPARE_ERROR(errctx); FAIL_ZERO_RETURN(errctx, obj, ERR_NULLPOINTER, "Null actor reference"); ATTEMPT { - if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_LEFT) ) { + if ( BITMASK_HAS(obj->logicstate, ACTOR_STATE_MOVING_LEFT) ) { obj->x -= obj->basechar->vx; } - if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_RIGHT) ) { + if ( BITMASK_HAS(obj->logicstate, ACTOR_STATE_MOVING_RIGHT) ) { obj->x += obj->basechar->vx; } - if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_UP) ) { + if ( BITMASK_HAS(obj->logicstate, ACTOR_STATE_MOVING_UP) ) { obj->y -= obj->basechar->vy; } - if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_DOWN) ) { + if ( BITMASK_HAS(obj->logicstate, ACTOR_STATE_MOVING_DOWN) ) { obj->y += obj->basechar->vy; } obj->logictimer = curtimems; @@ -157,7 +157,7 @@ ErrorContext *actor_update(actor *obj) } FINISH(errctx, false); ATTEMPT { - CATCH(errctx, character_sprite_get(obj->basechar, obj->state, &curSprite)); + CATCH(errctx, character_sprite_get(obj->basechar, obj->visualstate, &curSprite)); // is it time to change frames? if ( (curtimems - obj->curSpriteFrameTimer) >= curSprite->speed ) { CATCH(errctx, obj->changeframefunc(obj, curSprite, curtimems)); @@ -182,7 +182,7 @@ static ErrorContext *actor_visible(actor *obj, SDL_FRect *camera, bool *visible) FAIL_ZERO_RETURN(errctx, obj->basechar, ERR_NULLPOINTER, "Actor has NULL base character reference"); ATTEMPT { - CATCH(errctx, character_sprite_get(obj->basechar, obj->state, &curSprite)); + CATCH(errctx, character_sprite_get(obj->basechar, obj->visualstate, &curSprite)); } CLEANUP { } PROCESS(errctx) { } HANDLE(errctx, ERR_KEY) { @@ -215,7 +215,7 @@ ErrorContext *actor_render(actor *obj, SDL_Renderer *renderer) FAIL_ZERO_RETURN(errctx, obj->basechar, ERR_NULLPOINTER, "Actor has NULL base character reference"); ATTEMPT { - CATCH(errctx, character_sprite_get(obj->basechar, obj->state, &curSprite)); + CATCH(errctx, character_sprite_get(obj->basechar, obj->visualstate, &curSprite)); CATCH(errctx, actor_visible(obj, &camera, &visible)); } CLEANUP { } PROCESS(errctx) { diff --git a/lib_src/gamepad.c b/lib_src/gamepad.c index bc70fbb..3df8099 100644 --- a/lib_src/gamepad.c +++ b/lib_src/gamepad.c @@ -16,37 +16,37 @@ ErrorContext *gamepad_handle_button_down(void *appstate, SDL_Event *event) FAIL_ZERO_RETURN(errctx, appstate, ERR_NULLPOINTER, "Player actor does not exist"); if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_DOWN ) { - SDL_Log("Processing dpad down : state %d", player->state); - BITMASK_ADD(player->state, ACTOR_STATE_MOVING_DOWN); + SDL_Log("Processing dpad down : state %d", player->logicstate); + BITMASK_ADD(player->logicstate, ACTOR_STATE_MOVING_DOWN); if ( !player->movement_controls_face ) { - BITMASK_DEL(player->state, ACTOR_STATE_FACE_ALL); - BITMASK_ADD(player->state, ACTOR_STATE_FACE_DOWN); + BITMASK_DEL(player->visualstate, ACTOR_STATE_FACE_ALL); + BITMASK_ADD(player->visualstate, ACTOR_STATE_FACE_DOWN); } - SDL_Log("New state : %d", player->state); + SDL_Log("New state : %d", player->logicstate); } else if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_UP ) { SDL_Log("Processing dpad up"); - BITMASK_ADD(player->state, ACTOR_STATE_MOVING_UP); + BITMASK_ADD(player->logicstate, ACTOR_STATE_MOVING_UP); if ( !player->movement_controls_face ) { - BITMASK_DEL(player->state, ACTOR_STATE_FACE_ALL); - BITMASK_ADD(player->state, ACTOR_STATE_FACE_UP); + BITMASK_DEL(player->visualstate, ACTOR_STATE_FACE_ALL); + BITMASK_ADD(player->visualstate, ACTOR_STATE_FACE_UP); } - SDL_Log("New state : %d", player->state); + SDL_Log("New state : %d", player->logicstate); } else if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_LEFT ) { SDL_Log("Processing dpad left"); - BITMASK_ADD(player->state, ACTOR_STATE_MOVING_LEFT); + BITMASK_ADD(player->logicstate, ACTOR_STATE_MOVING_LEFT); if ( !player->movement_controls_face ) { - BITMASK_DEL(player->state, ACTOR_STATE_FACE_ALL); - BITMASK_ADD(player->state, ACTOR_STATE_FACE_LEFT); + BITMASK_DEL(player->visualstate, ACTOR_STATE_FACE_ALL); + BITMASK_ADD(player->visualstate, ACTOR_STATE_FACE_LEFT); } - SDL_Log("New state : %d", player->state); + SDL_Log("New state : %d", player->logicstate); } else if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_RIGHT ) { SDL_Log("Processing dpad right"); - BITMASK_ADD(player->state, ACTOR_STATE_MOVING_RIGHT); + BITMASK_ADD(player->logicstate, ACTOR_STATE_MOVING_RIGHT); if ( !player->movement_controls_face ) { - BITMASK_DEL(player->state, ACTOR_STATE_FACE_ALL); - BITMASK_ADD(player->state, ACTOR_STATE_FACE_RIGHT); + BITMASK_DEL(player->visualstate, ACTOR_STATE_FACE_ALL); + BITMASK_ADD(player->visualstate, ACTOR_STATE_FACE_RIGHT); } - SDL_Log("New state : %d", player->state); + SDL_Log("New state : %d", player->logicstate); } SUCCEED_RETURN(errctx); } @@ -64,24 +64,24 @@ ErrorContext *gamepad_handle_button_up(void *appstate, SDL_Event *event) if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_DOWN ) { SDL_Log("processing down release"); - BITMASK_DEL(player->state, ACTOR_STATE_MOVING_DOWN); + BITMASK_DEL(player->logicstate, ACTOR_STATE_MOVING_DOWN); player->curSpriteFrameId = 0; - SDL_Log("New state : %d", player->state); + SDL_Log("New state : %d", player->logicstate); } else if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_UP) { SDL_Log("processing up release"); - BITMASK_DEL(player->state, ACTOR_STATE_MOVING_UP); + BITMASK_DEL(player->logicstate, ACTOR_STATE_MOVING_UP); player->curSpriteFrameId = 0; - SDL_Log("New state : %d", player->state); + SDL_Log("New state : %d", player->logicstate); } else if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_RIGHT ) { SDL_Log("processing right release"); - BITMASK_DEL(player->state, ACTOR_STATE_MOVING_RIGHT); + BITMASK_DEL(player->logicstate, ACTOR_STATE_MOVING_RIGHT); player->curSpriteFrameId = 0; - SDL_Log("New state : %d", player->state); + SDL_Log("New state : %d", player->logicstate); } else if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_LEFT) { SDL_Log("processing left release"); - BITMASK_DEL(player->state, ACTOR_STATE_MOVING_LEFT); + BITMASK_DEL(player->logicstate, ACTOR_STATE_MOVING_LEFT); player->curSpriteFrameId = 0; - SDL_Log("New state : %d", player->state); + SDL_Log("New state : %d", player->logicstate); } SUCCEED_RETURN(errctx); } diff --git a/lib_src/tilemap.c b/lib_src/tilemap.c index 7138ae1..b65e031 100644 --- a/lib_src/tilemap.c +++ b/lib_src/tilemap.c @@ -229,7 +229,8 @@ ErrorContext *tilemap_load_layer_object_actor(tilemap_object *curobj, json_t *la } else { actorobj->refcount += 1; } - CATCH(errctx, get_json_properties_integer((json_t *)layerdatavalue, "state", &actorobj->state)); + CATCH(errctx, get_json_properties_integer((json_t *)layerdatavalue, "logicstate", &actorobj->logicstate)); + CATCH(errctx, get_json_properties_integer((json_t *)layerdatavalue, "visualstate", &actorobj->visualstate)); } CLEANUP { if ( tmpstr != NULL ) { IGNORE(heap_release_string(tmpstr)); diff --git a/src/sdl3-gametest.c b/src/sdl3-gametest.c index d21bede..884b1bb 100644 --- a/src/sdl3-gametest.c +++ b/src/sdl3-gametest.c @@ -137,7 +137,8 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) return SDL_APP_FAILURE; } FINISH_NORETURN(errctx); - actorptr->state = (ACTOR_STATE_ALIVE | ACTOR_STATE_FACE_LEFT); + actorptr->logicstate = ACTOR_STATE_ALIVE; + actorptr->visualstate = ACTOR_STATE_FACE_LEFT; actorptr->x = 320; actorptr->y = 240; actorptr->visible = true; diff --git a/tests/assets/testmap.tmj b/tests/assets/testmap.tmj index dfac9e0..8961c3c 100644 --- a/tests/assets/testmap.tmj +++ b/tests/assets/testmap.tmj @@ -33,9 +33,14 @@ "value":"testcharacter" }, { - "name":"state", + "name":"logicstate", "type":"int", - "value":6 + "value":16 + }, + { + "name":"visualstate", + "type":"int", + "value":2 }], "rotation":0, "type":"actor", diff --git a/tests/test_tilemap.c b/tests/test_tilemap.c index 89933e0..ce64ac5 100644 --- a/tests/test_tilemap.c +++ b/tests/test_tilemap.c @@ -157,7 +157,7 @@ ErrorContext *test_tilemap_load_layer_objects(void) ); if ( (testactor->basechar != SDL_GetPointerProperty(REGISTRY_CHARACTER, "testcharacter", NULL)) || (testactor->layer != 1) || - (testactor->state != 6) || + (testactor->logicstate != 6) || (testactor->visible != true) || (testactor->x != 16) || (testactor->y != 16) ) {