Add trees as entities

This commit is contained in:
2023-11-17 16:32:41 +01:00
parent 021df6d77a
commit 16d98a4691
7 changed files with 85 additions and 7 deletions

View File

@@ -1,5 +1,8 @@
#include "components.h"
ECS_TAG_DECLARE(TextureTerrain);
ECS_TAG_DECLARE(TextureBuildings);
ECS_TAG_DECLARE(TextureEntities);
ECS_COMPONENT_DECLARE(TilePosition);
ECS_COMPONENT_DECLARE(TileSize);
@@ -8,6 +11,7 @@ ECS_COMPONENT_DECLARE(Position);
ECS_COMPONENT_DECLARE(Size);
ECS_COMPONENT_DECLARE(TargetPosition);
ECS_COMPONENT_DECLARE(MoveForce);
ECS_COMPONENT_DECLARE(Resource);
ECS_COMPONENT_DECLARE(SpatialGridID);
ECS_COMPONENT_DECLARE(Rotation);
ECS_COMPONENT_DECLARE(Health);
@@ -17,6 +21,10 @@ ECS_COMPONENT_DECLARE(Animation);
ECS_COMPONENT_DECLARE(Path);
void initComponentIDs(ecs_world_t *ecs) {
ECS_TAG_DEFINE(ecs, TextureTerrain);
ECS_TAG_DEFINE(ecs, TextureBuildings);
ECS_TAG_DEFINE(ecs, TextureEntities);
ECS_COMPONENT_DEFINE(ecs, TilePosition);
ECS_COMPONENT_DEFINE(ecs, TileSize);
ECS_COMPONENT_DEFINE(ecs, Owner);
@@ -24,6 +32,7 @@ void initComponentIDs(ecs_world_t *ecs) {
ECS_COMPONENT_DEFINE(ecs, Size);
ECS_COMPONENT_DEFINE(ecs, TargetPosition);
ECS_COMPONENT_DEFINE(ecs, MoveForce);
ECS_COMPONENT_DEFINE(ecs, Resource);
ECS_COMPONENT_DEFINE(ecs, SpatialGridID);
ECS_COMPONENT_DEFINE(ecs, Rotation);
ECS_COMPONENT_DEFINE(ecs, Health);

View File

@@ -6,8 +6,9 @@
#include "utils/building_types.h"
#define ecs_set_p(world, e, T, ...) ecs_set_id(world, e, ecs_id(T), sizeof(T), (T*)__VA_ARGS__)
extern ECS_TAG_DECLARE(TextureTerrain);
extern ECS_TAG_DECLARE(TextureBuildings);
extern ECS_TAG_DECLARE(TextureEntities);
typedef struct TilePosition {
BzTile x;
@@ -32,6 +33,20 @@ extern ECS_COMPONENT_DECLARE(Size);
extern ECS_COMPONENT_DECLARE(TargetPosition);
extern ECS_COMPONENT_DECLARE(MoveForce);
typedef enum ResourceType {
RES_IRON,
RES_WOOD,
RES_GOLD,
RES_FOOD,
RES_COUNT,
} ResourceType;
typedef struct Resource {
ResourceType type;
i32 amount;
} Resource;
extern ECS_COMPONENT_DECLARE(Resource);
typedef BzSpatialGridID SpatialGridID;
extern ECS_COMPONENT_DECLARE(SpatialGridID);

View File

@@ -106,6 +106,9 @@ bool init(void *userData) {
.userDataSize=sizeof(ecs_entity_t)
});
bzTileMapOverrideLayer(&game->map, LAYER_TREES, initTreesLayer);
bzTileMapOverrideLayer(&game->map, LAYER_TREES2, initTreesLayer);
bzTileMapOverrideLayer(&game->map, LAYER_BUILDING_OWNER, initBuildingsLayer);
bzTileMapOverrideObjectGroup(&game->map, OBJECTS_GAME, initGameObjectsLayer);
@@ -116,7 +119,11 @@ bool init(void *userData) {
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, renderEntities, EcsOnUpdate, Position, Size, Rotation, TextureRegion);
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_OBSERVER(ECS, targetFinish, EcsOnRemove, TargetPosition);
ECS_OBSERVER(ECS, startPath, EcsOnSet, Path);
return true;

View File

@@ -27,6 +27,7 @@ bool initEntityObjectsLayer(BzTileMap *map, BzTileObjectGroup *objectGroup) {
BzTileObject object = objectGroup->objects[i];
ecs_entity_t e = ecs_new_id(ECS);
game->entity = e;
ecs_add(ECS, e, TextureEntities);
ecs_set(ECS, e, Position, {object.shape.x, object.shape.y});
ecs_set(ECS, e, Size, {object.shape.sizeX, object.shape.sizeY});
BzSpatialGridID spatialID = bzSpatialGridInsert(game->entityGrid, &e,
@@ -70,7 +71,6 @@ bool initBuildingsLayer(BzTileMap *map, BzTileLayer *layer) {
TileSize size = {};
getBuildingSize(buildingTile, &size.sizeX, &size.sizeY);
bzTileLayerSetTile(ownershipLayer, 0, x, y, size.sizeX, size.sizeY);
bzLogInfo("Got size: %2d %2d", size.sizeX, size.sizeY);
ecs_entity_t e = ecs_new_id(ECS);
ecs_set(ECS, e, TilePosition, {.x=x, .y=y});
@@ -85,3 +85,32 @@ bool initBuildingsLayer(BzTileMap *map, BzTileLayer *layer) {
return true;
}
bool initTreesLayer(BzTileMap *map, BzTileLayer *layer) {
Game *game = ecs_singleton_get_mut(ECS, Game);
BzTileset *tileset = bzTileLayerGetTileset(map, layer);
for (i32 y = 0; y < layer->height; y++) {
for (i32 x = 0; x < layer->width; x++) {
BzTile tile = layer->data[y * layer->width + x];
BzTile layerTile = tile;
tile = bzTilesetGetTile(tileset, tile);
if (tile != 185) continue; // Not a tree
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;
ecs_entity_t e = ecs_new_id(ECS);
ecs_add(ECS, e, TextureTerrain);
ecs_set(ECS, e, Position, {posX, posY});
ecs_set(ECS, e, Size, {sizeX, sizeY});
ecs_set(ECS, e, Rotation, {0});
ecs_set(ECS, e, TextureRegion, {tileset->tiles, bzTilesetGetTileRegion(tileset, layerTile)});
ecs_set(ECS, e, Resource, {RES_WOOD, 20});
}
}
return true;
}

View File

@@ -9,4 +9,6 @@ bool initEntityObjectsLayer(BzTileMap *map, BzTileObjectGroup *objectGroup);
bool initBuildingsLayer(BzTileMap *map, BzTileLayer *layer);
bool initTreesLayer(BzTileMap *map, BzTileLayer *layer);
#endif //PIXELDEFENSE_MAP_INITIALIZATION_H

View File

@@ -28,8 +28,14 @@ void entityAdded(ecs_iter_t *it);
*/
void entityUpdatePhysics(ecs_iter_t *it);
/*
* 0:
*/
void renderTerrain(ecs_iter_t *it);
void renderBuildings(ecs_iter_t *it);
void renderEntities(ecs_iter_t *it);
//void renderEntities(ecs_iter_t *it);
void updateAnimations(ecs_iter_t *it);
void updatePos(ecs_iter_t *it);
void targetFinish(ecs_iter_t *it);

View File

@@ -46,7 +46,7 @@ void updateAnimations(ecs_iter_t *it) {
}
}
void renderEntities(ecs_iter_t *it) {
static void render(ecs_iter_t *it) {
Position *p = ecs_field(it, Position, 1);
Size *s = ecs_field(it, Size, 2);
Rotation *r = ecs_field(it, Rotation, 3);
@@ -59,10 +59,20 @@ void renderEntities(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.width, dst.height, RED);
//DrawRectangleLines(dst.x - dst.width * 0.5f, dst.y - dst.height * 0.5f, dst.width, dst.height, RED);
}
}
void renderTerrain(ecs_iter_t *it) {
render(it);
}
void renderBuildings(ecs_iter_t *it) {
render(it);
}
void renderEntities(ecs_iter_t *it) {
render(it);
}
void updatePos(ecs_iter_t *it) {
Position *pos = ecs_field(it, Position, 1);
TargetPosition *target = ecs_field(it, TargetPosition, 2);