diff --git a/CMakeLists.txt b/CMakeLists.txt index 2785f03..784785a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,7 @@ add_subdirectory(engine/) add_executable(PixelDefense + game/systems/animations.c game/systems/entity_renderer.c game/systems/systems.h diff --git a/assets/entities.tsj b/assets/entities.tsj index b4c46eb..6088bbb 100644 --- a/assets/entities.tsj +++ b/assets/entities.tsj @@ -11,18 +11,42 @@ "tiles":[ { "id":0, + "properties":[ + { + "name":"animation", + "type":"string", + "value":"idle_0" + }], "type":"worker" }, { "id":1, + "properties":[ + { + "name":"animation", + "type":"string", + "value":"idle_1" + }], "type":"worker" }, { "id":2, + "properties":[ + { + "name":"animation", + "type":"string", + "value":"walk_0" + }], "type":"worker" }, { "id":3, + "properties":[ + { + "name":"animation", + "type":"string", + "value":"walk_1" + }], "type":"worker" }, { diff --git a/engine/breeze/game.h b/engine/breeze/game.h index 9bda56e..328c55c 100644 --- a/engine/breeze/game.h +++ b/engine/breeze/game.h @@ -109,8 +109,8 @@ int main(int argc, const char **argv) { if (appDesc.update) appDesc.update(dt, appDesc.userData); - if (ECS) - ecs_progress(ECS, dt); + //if (ECS) + // ecs_progress(ECS, dt); BeginDrawing(); if (appDesc.render) diff --git a/game/components.h b/game/components.h index dee3ce5..dfe7b74 100644 --- a/game/components.h +++ b/game/components.h @@ -30,6 +30,20 @@ typedef struct TextureRegion { Rectangle rec; } TextureRegion; +typedef enum AnimationType { + ANIMATION_IDLE, + ANIMATION_WALK, +} AnimationType; + +typedef struct Animation { + TextureRegion firstFrame; + AnimationType currAnimation; + i32 currFrame; + i32 frameCount; + f32 frameDuration; + f32 elapsed; +} Animation; + #endif //PIXELDEFENSE_COMPONENTS_H diff --git a/game/main.c b/game/main.c index ec250e3..0c76064 100644 --- a/game/main.c +++ b/game/main.c @@ -1,5 +1,6 @@ #include +#include "systems/systems.h" #include "utils/building_types.h" #include "components.h" #include "game_state.h" @@ -82,6 +83,8 @@ bool init(Game *game) { bzTileMapOverrideObjectGroup(&game->map, OBJECTS_GAME, initGameObjectsLayer); bzTileMapOverrideObjectGroup(&game->map, OBJECTS_ENTITIES, initEntityObjectsLayer); + ECS_SYSTEM(ECS, updateAnimations, EcsOnUpdate, Animation, TextureRegion); + ECS_SYSTEM(ECS, renderEntities, EcsOnUpdate, Position, Size, Rotation, TextureRegion); return true; } @@ -146,6 +149,8 @@ void render(float dt, Game *game) { bzTileMapDraw(&game->map); bzTileMapDrawColliders(&game->map); + ecs_progress(ECS, dt); + EndMode2D(); } diff --git a/game/map_init.c b/game/map_init.c index 710da32..a1ed813 100644 --- a/game/map_init.c +++ b/game/map_init.c @@ -22,6 +22,7 @@ bool initEntityObjectsLayer(BzTileMap *map, BzTileObjectGroup *objectGroup) { ECS_COMPONENT(ECS, Size); ECS_COMPONENT(ECS, Rotation); ECS_COMPONENT(ECS, TextureRegion); + ECS_COMPONENT(ECS, Animation); BzTileset *objectTileset = bzTileObjectGroupGetTileset(&GAME->map, objectGroup); if (!objectTileset) return true; @@ -33,6 +34,16 @@ bool initEntityObjectsLayer(BzTileMap *map, BzTileObjectGroup *objectGroup) { ecs_set(ECS, e, Size, {object.shape.sizeX, object.shape.sizeY}); ecs_set(ECS, e, Rotation, {0.0f}); ecs_set(ECS, e, TextureRegion, {objectTileset->tiles, bzTilesetGetTileRegion(objectTileset, object.gid)}); + ecs_set(ECS, e, Animation, { + .firstFrame=(TextureRegion) { + objectTileset->tiles, + bzTilesetGetTileRegion(objectTileset, object.gid) + }, + .currAnimation=ANIMATION_IDLE, + .currFrame=0, + .frameCount=2, + .frameDuration=0.36f + }); } return true; diff --git a/game/systems/animations.c b/game/systems/animations.c new file mode 100644 index 0000000..0669993 --- /dev/null +++ b/game/systems/animations.c @@ -0,0 +1,17 @@ +#include "systems.h" + +void updateAnimations(ecs_iter_t *it) { + Animation *anim = ecs_field(it, Animation, 1); + TextureRegion *t = ecs_field(it, TextureRegion, 2); + + float dt = GetFrameTime(); + + for (i32 i = 0; i < it->count; i++) { + anim[i].elapsed += dt; + if (anim[i].elapsed < anim[i].frameDuration) continue; + + anim[i].currFrame = (anim[i].currFrame + 1) % anim[i].frameCount; + anim[i].elapsed = 0.0f; + t[i].rec.x = anim[i].firstFrame.rec.x + anim[i].currFrame * t[i].rec.width; + } +} diff --git a/game/systems/systems.h b/game/systems/systems.h index e9dd67e..7759ade 100644 --- a/game/systems/systems.h +++ b/game/systems/systems.h @@ -6,5 +6,6 @@ #include "../components.h" void renderEntities(ecs_iter_t *it); +void updateAnimations(ecs_iter_t *it); #endif //PIXELDEFENSE_SYSTEMS_H diff --git a/tiled/entities.tsx b/tiled/entities.tsx index c0043ef..b5c48e2 100644 --- a/tiled/entities.tsx +++ b/tiled/entities.tsx @@ -4,9 +4,25 @@ - - - - + + + + + + + + + + + + + + + + + + + +