From 2167d10501454e5c429c3a8d3a4953836c54a42d Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Fri, 17 Nov 2023 19:39:49 +0100 Subject: [PATCH] Tweak spatial grid size, add colliders rendering --- game/main.c | 7 +++++-- game/map_init.c | 7 +++++-- game/systems.h | 6 ++++++ game/systems_entity.c | 17 ++++++++++++++--- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/game/main.c b/game/main.c index a5ae0cf..c71004b 100644 --- a/game/main.c +++ b/game/main.c @@ -101,8 +101,8 @@ bool init(void *userData) { game->entityGrid = bzSpatialGridCreate(&(BzSpatialGridDesc) { .maxWidth=game->map.width * game->map.tileWidth, .maxHeight=game->map.height * game->map.tileHeight, - .cellWidth=game->map.tileWidth * 5, - .cellHeight=game->map.tileHeight * 5, + .cellWidth=game->map.tileWidth * 4, + .cellHeight=game->map.tileHeight * 4, .userDataSize=sizeof(ecs_entity_t) }); @@ -118,12 +118,15 @@ bool init(void *userData) { ECS_SYSTEM(ECS, updateAnimations, EcsOnUpdate, Animation, TextureRegion); ECS_SYSTEM(ECS, updatePos, EcsOnUpdate, Position, TargetPosition, TextureRegion); ECS_SYSTEM(ECS, entityUpdatePhysics, EcsOnUpdate, Position, Size, SpatialGridID); + ECS_SYSTEM(ECS, drawDebugPath, EcsOnUpdate, Path); ECS_SYSTEM(ECS, renderTerrain, EcsOnUpdate, Position, Size, Rotation, TextureRegion, TextureTerrain); ECS_SYSTEM(ECS, renderBuildings, EcsOnUpdate, Position, Size, Rotation, TextureRegion, TextureBuildings); ECS_SYSTEM(ECS, renderEntities, EcsOnUpdate, Position, Size, Rotation, TextureRegion, TextureEntities); + ECS_SYSTEM(ECS, renderColliders, EcsOnUpdate, Position, Size); + ECS_OBSERVER(ECS, targetFinish, EcsOnRemove, TargetPosition); ECS_OBSERVER(ECS, startPath, EcsOnSet, Path); return true; diff --git a/game/map_init.c b/game/map_init.c index ce54dbb..ca27147 100644 --- a/game/map_init.c +++ b/game/map_init.c @@ -100,9 +100,12 @@ bool initTreesLayer(BzTileMap *map, BzTileLayer *layer) { f32 sizeX = tileset->tileWidth; f32 sizeY = tileset->tileHeight; - f32 posX = layer->offsetX + x * sizeX + sizeX * 0.5f; - f32 posY = layer->offsetY + y * sizeY + sizeY * 0.5f; + f32 posX = layer->offsetX + x * sizeX; + f32 posY = layer->offsetY + y * sizeY; ecs_entity_t e = ecs_new_id(ECS); + bzSpatialGridInsert(game->entityGrid, &e, posX, posY, sizeX, sizeY);; + posX += sizeX * 0.5f; + posY += sizeY * 0.5f; ecs_add(ECS, e, TextureTerrain); ecs_set(ECS, e, Position, {posX, posY}); ecs_set(ECS, e, Size, {sizeX, sizeY}); diff --git a/game/systems.h b/game/systems.h index 7b42148..4d7cd99 100644 --- a/game/systems.h +++ b/game/systems.h @@ -35,6 +35,12 @@ void renderTerrain(ecs_iter_t *it); void renderBuildings(ecs_iter_t *it); void renderEntities(ecs_iter_t *it); +/* + * 1: Position + * 2: Size + */ +void renderColliders(ecs_iter_t *it); + //void renderEntities(ecs_iter_t *it); void updateAnimations(ecs_iter_t *it); void updatePos(ecs_iter_t *it); diff --git a/game/systems_entity.c b/game/systems_entity.c index 3cebe06..21f1b74 100644 --- a/game/systems_entity.c +++ b/game/systems_entity.c @@ -22,8 +22,9 @@ void entityUpdatePhysics(ecs_iter_t *it) { //bzSpatialGridUpdate(game->entityGrid, spatialID[i], pos[i].x, pos[i].y, size[i].x, size[i].y); ecs_entity_t *e = bzSpatialGridGetData(game->entityGrid, spatialID[i]); BZ_ASSERT(*e == it->entities[i]); - bzSpatialGridRemove(game->entityGrid, spatialID[i]); - spatialID[i] = bzSpatialGridInsert(game->entityGrid, &(it->entities[i]), pos[i].x, pos[i].y, size[i].x, size[i].y); + f32 posX = pos[i].x - size[i].x * 0.5f; + f32 posY = pos[i].y - size[i].y * 0.5f; + bzSpatialGridUpdate(game->entityGrid, spatialID[i], posX, posY, size[i].x, size[i].y); } } @@ -59,7 +60,6 @@ static void render(ecs_iter_t *it) { if (t[i].flipX) src.width *= -1.0f; if (t[i].flipY) src.height *= -1.0f; DrawTexturePro(t[i].texture, src, dst, origin, r[i], WHITE); - //DrawRectangleLines(dst.x - dst.width * 0.5f, dst.y - dst.height * 0.5f, dst.width, dst.height, RED); } } @@ -73,6 +73,17 @@ void renderEntities(ecs_iter_t *it) { render(it); } +void renderColliders(ecs_iter_t *it) { + Position *pos = ecs_field(it, Position, 1); + Size *size = ecs_field(it, Size, 2); + + for (i32 i = 0; i < it->count; i++) { + f32 posX = pos[i].x - size[i].x * 0.5f; + f32 posY = pos[i].y - size[i].y * 0.5f; + DrawRectangleLines(posX, posY, size[i].x, size[i].y, RED); + } +} + void updatePos(ecs_iter_t *it) { Position *pos = ecs_field(it, Position, 1); TargetPosition *target = ecs_field(it, TargetPosition, 2);