diff --git a/game/components.c b/game/components.c index 2ec7183..4228690 100644 --- a/game/components.c +++ b/game/components.c @@ -21,8 +21,7 @@ ECS_COMPONENT_DECLARE(Path); ECS_COMPONENT_DECLARE(TextureRegion); -//ECS_COMPONENT_DECLARE(Animation); -//ECS_COMPONENT_DECLARE(AnimationType); +ECS_COMPONENT_DECLARE(Animation); ECS_TAG_DECLARE(Selectable); ECS_TAG_DECLARE(Selected); @@ -60,8 +59,7 @@ void initComponentIDs(ecs_world_t *ecs) { ECS_COMPONENT_DEFINE(ecs, TextureRegion); - //ECS_COMPONENT_DEFINE(ecs, Animation); - //ECS_COMPONENT_DEFINE(ecs, AnimationType); + ECS_COMPONENT_DEFINE(ecs, Animation); ECS_TAG_DEFINE(ecs, Selectable); ECS_TAG_DEFINE(ecs, Selected); diff --git a/game/components.h b/game/components.h index 5453192..f7fbf68 100644 --- a/game/components.h +++ b/game/components.h @@ -101,23 +101,19 @@ extern ECS_COMPONENT_DECLARE(TextureRegion); * Animation components *********************************************************/ -/* typedef struct Animation { EntityType entityType; - AnimationType animType; + AnimType animType; + + AnimationFrame frame; AnimationSequence sequence; - BzTileset *tileset; + BzTileset *tileset; + i32 curFrame; - f32 frameDuration; f32 elapsed; } Animation; extern ECS_COMPONENT_DECLARE(Animation); -extern ECS_COMPONENT_DECLARE(AnimationType); - */ - - - typedef struct EntityArms { ecs_entity_t left; ecs_entity_t right; diff --git a/game/main.c b/game/main.c index 3497486..773d6b0 100644 --- a/game/main.c +++ b/game/main.c @@ -61,7 +61,7 @@ void terrainRender(BzTileMap *map, BzTileLayer *layer) { tile = bzTilesetGetTileID(tileset, tile); if (tile != -1) { if (terrainHasAnimation(tile)) { - f32 frameDuration = terrainGetAnimationFrame(tile, 0).duration / 1000.0f; + f32 frameDuration = terrainGetAnimationFrame(tile, 0).duration; i32 numFrames = terrainGetAnimationSequence(tile).frameCount; i32 frameIdx = (i32) (elapsed / frameDuration) % numFrames; tile = terrainGetAnimationFrame(tile, frameIdx).frame; @@ -174,7 +174,7 @@ bool init(void *userData) { ECS_SYSTEM(ECS, entityHarvestTaskSystem, EcsOnUpdate, Position, Rotation, HarvestTask); //ECS_SYSTEM(ECS, entityUpdateAnimationState, EcsOnUpdate, Velocity, AnimationType); - //ECS_SYSTEM(ECS, entityUpdateAnimation, EcsOnUpdate, Animation, TextureRegion); + ECS_SYSTEM(ECS, entityUpdateAnimation, EcsOnUpdate, Animation, TextureRegion); ECS_SYSTEM(ECS, renderDebugPath, EcsOnUpdate, Path); diff --git a/game/map_init.c b/game/map_init.c index 7827bdb..0d1330f 100644 --- a/game/map_init.c +++ b/game/map_init.c @@ -139,14 +139,15 @@ ecs_entity_t createWorker(Position position, Size size, BzSpatialGrid *grid, BzT ecs_set(ECS, e, Velocity, {}); ecs_set(ECS, e, Steering, {}); ecs_set(ECS, e, TextureRegion, {tileset->tiles, bzTilesetGetTileRegion(tileset, gid)}); - /* ecs_set(ECS, e, Animation, { - .entityType=ENTITY_WORKER, - .tileset = tileset, - .curFrame=0, + .entityType = ENTITY_WORKER, + .animType = ANIM_IDLE, + + .sequence = entityGetAnimationSequence(ENTITY_WORKER, ANIM_IDLE), + .tileset = tileset, + .curFrame = 0, + .elapsed = 0.0f, }); - ecs_set(ECS, e, AnimationType, {ANIM_IDLE}); - */ ecs_add_id(ECS, e, Selectable); ecs_add_id(ECS, e, Unit); ecs_add_id(ECS, e, Worker); diff --git a/game/systems_entity.c b/game/systems_entity.c index 0f05998..c36398d 100644 --- a/game/systems_entity.c +++ b/game/systems_entity.c @@ -288,25 +288,26 @@ void entityUpdateAnimationState(ecs_iter_t *it) { } } void entityUpdateAnimation(ecs_iter_t *it) { - /* - Game *game = ecs_singleton_get_mut(ECS, Game); - Animation *anim = ecs_field(it, Animation, 1); - TextureRegion *t = ecs_field(it, TextureRegion, 2); + Game *game = ecs_singleton_get_mut(ECS, Game); + Animation *anim = ecs_field(it, Animation, 1); + TextureRegion *texture = ecs_field(it, TextureRegion, 2); float dt = GetFrameTime(); for (i32 i = 0; i < it->count; i++) { - anim[i].frameDuration = game->frameDuration; + AnimationFrame frame = anim[i].frame; + AnimationSequence seq = anim[i].sequence; + anim[i].elapsed += dt; - if (anim[i].elapsed < anim[i].frameDuration) continue; + if (anim[i].elapsed < frame.duration) continue; - anim[i].curFrame = (anim[i].curFrame + 1) % anim[i].sequence.frameCount; + i32 nextFrame = (anim[i].curFrame + 1) % seq.frameCount; + anim[i].curFrame = nextFrame; + anim[i].frame = entityGetAnimationFrame(anim[i].entityType, anim[i].animType, nextFrame); + anim[i].elapsed = 0.0f; - BzTile tile = anim[i].sequence.startFrame + anim[i].curFrame + anim[i].tileset->startID; - t[i].rec = bzTilesetGetTileRegion(anim[i].tileset, tile); - anim[i].elapsed = 0.0f; + texture[i].rec = bzTilesetGetTileRegion(anim[i].tileset, anim[i].frame.frame); } - */ } static void render(ecs_iter_t *it) {