Add entity_factory
This commit is contained in:
@@ -22,6 +22,8 @@ add_executable(PixelDefense
|
||||
game/buildings.h
|
||||
game/components.c
|
||||
game/components.h
|
||||
game/entity_factory.c
|
||||
game/entity_factory.h
|
||||
game/entrypoint.c
|
||||
game/game_state.h
|
||||
game/game_tileset.h
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "buildings.h"
|
||||
|
||||
#include "components.h"
|
||||
#include "entity_factory.h"
|
||||
#include "game_state.h"
|
||||
#include "map_layers.h"
|
||||
|
||||
@@ -55,7 +56,7 @@ ecs_entity_t placeBuilding(BzTileMap *map, BuildingType type, BzTile tileX, BzTi
|
||||
BZ_ASSERT(buildingTile != -1);
|
||||
|
||||
// Create entity
|
||||
ecs_entity_t e = entityCreate(ECS);
|
||||
ecs_entity_t e = entityCreateEmpty();
|
||||
|
||||
ecs_set(ECS, e, TilePosition, { .x = tileX, .y = tileY });
|
||||
ecs_set(ECS, e, TileSize, { .sizeX = sizeX, .sizeY = sizeY });
|
||||
|
||||
@@ -152,6 +152,21 @@ typedef struct EntityArms {
|
||||
* Gameplay components
|
||||
*********************************************************/
|
||||
|
||||
|
||||
typedef struct WeaponMelee {
|
||||
|
||||
} WeaponMelee;
|
||||
typedef struct WeaponRanged {
|
||||
|
||||
} WeaponRanged;
|
||||
typedef struct WeaponShield {
|
||||
|
||||
} WeaponShield;
|
||||
typedef struct AttachedWeapons {
|
||||
ecs_entity_t primary;
|
||||
ecs_entity_t secondary;
|
||||
} AttachedWeapons;
|
||||
|
||||
extern ECS_COMPONENT_DECLARE(UnitAction);
|
||||
extern ECS_COMPONENT_DECLARE(UnitAI);
|
||||
|
||||
@@ -185,11 +200,4 @@ extern ECS_TAG_DECLARE(Attackable);
|
||||
|
||||
void initComponentIDs(ecs_world_t *ecs);
|
||||
|
||||
static ecs_entity_t entityCreate(ecs_world_t *ecs) {
|
||||
ecs_entity_t entity = ecs_new_id(ecs);
|
||||
ecs_add_id(ecs, entity, GameEntity);
|
||||
return entity;
|
||||
}
|
||||
|
||||
|
||||
#endif //PIXELDEFENSE_COMPONENTS_H
|
||||
|
||||
46
game/entity_factory.c
Normal file
46
game/entity_factory.c
Normal file
@@ -0,0 +1,46 @@
|
||||
#include "entity_factory.h"
|
||||
#include "unit_actions.h"
|
||||
|
||||
ecs_entity_t entityCreateEmpty() {
|
||||
ecs_entity_t e = ecs_new_id(ECS);
|
||||
ecs_add_id(ECS, e, GameEntity);
|
||||
return e;
|
||||
}
|
||||
|
||||
ecs_entity_t entityCreateWorker(const Position position, Game *game) {
|
||||
const Size size = {10.0f, 10.0f};
|
||||
BzTileset *tileset = &game->tileset;
|
||||
ecs_entity_t e = entityCreateEmpty();
|
||||
ecs_set_ptr(ECS, e, Position, &position);
|
||||
ecs_set_ptr(ECS, e, Size, &size);
|
||||
BzSpatialGridID spatialID = bzSpatialGridInsert(game->entityGrid, &e,
|
||||
position.x, position.y,
|
||||
size.x, size.y);
|
||||
ecs_set(ECS, e, SpatialGridID, { spatialID });
|
||||
ecs_set(ECS, e, Rotation, { 0.0f });
|
||||
ecs_set(ECS, e, Velocity, {});
|
||||
ecs_set(ECS, e, Steering, {});
|
||||
TextureRegion workerRegion = {
|
||||
tileset->tiles,
|
||||
bzTilesetGetTileRegion(tileset, ENTITY_WORKER)
|
||||
};
|
||||
ecs_set_ptr(ECS, e, TextureRegion, &workerRegion);
|
||||
ecs_set(ECS, e, Animation, {
|
||||
.entityType = ENTITY_WORKER,
|
||||
.animType = ANIM_IDLE,
|
||||
|
||||
.sequence = entityGetAnimationSequence(ENTITY_WORKER, ANIM_IDLE),
|
||||
.tileset = tileset,
|
||||
.curFrame = 0,
|
||||
.elapsed = 0.0f,
|
||||
});
|
||||
ecs_set(ECS, e, UnitAction, { NULL, NULL });
|
||||
ecs_add_id(ECS, e, Selectable);
|
||||
ecs_add_id(ECS, e, Unit);
|
||||
ecs_set(ECS, e, Worker, {
|
||||
.collectSpeed = 0.8f,
|
||||
.depositSpeed = 0.2f,
|
||||
.carryCapacity = 5,
|
||||
});
|
||||
return e;
|
||||
}
|
||||
11
game/entity_factory.h
Normal file
11
game/entity_factory.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef PIXELDEFENSE_ENTITY_FACTORY_H
|
||||
#define PIXELDEFENSE_ENTITY_FACTORY_H
|
||||
|
||||
#include "components.h"
|
||||
#include "game_state.h"
|
||||
|
||||
ecs_entity_t entityCreateEmpty();
|
||||
|
||||
ecs_entity_t entityCreateWorker(const Position position, Game *game);
|
||||
|
||||
#endif //PIXELDEFENSE_ENTITY_FACTORY_H
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <flecs.h>
|
||||
|
||||
#include "components.h"
|
||||
#include "entity_factory.h"
|
||||
#include "game_state.h"
|
||||
#include "map_layers.h"
|
||||
|
||||
@@ -31,9 +32,8 @@ bool initEntityObjectsLayer(BzTileMap *map, BzTileObjectGroup *objectGroup) {
|
||||
for (i32 i = 0; i < objectGroup->objectCount; i++) {
|
||||
if (i == 1) break;
|
||||
BzTileObject object = objectGroup->objects[i];
|
||||
ecs_entity_t e = createWorker((Position) {object.shape.x, object.shape.y},
|
||||
(Size) {object.shape.sizeX, object.shape.sizeY},
|
||||
game->entityGrid, objectTileset, object.gid);
|
||||
Position pos = (Position) { object.shape.x, object.shape.y };
|
||||
entityCreateWorker(pos, game);
|
||||
/*ecs_set(ECS, e, Animation, {
|
||||
.entityType=ENTITY_WORKER,
|
||||
.tileset = objectTileset,
|
||||
@@ -76,7 +76,7 @@ bool initBuildingsLayer(BzTileMap *map, BzTileLayer *layer) {
|
||||
|
||||
const i32 tileWidth = map->tileWidth;
|
||||
const i32 tileHeight = map->tileHeight;
|
||||
ecs_entity_t e = entityCreate(ECS);
|
||||
ecs_entity_t e = entityCreateEmpty();
|
||||
Size size = {.x = tileSize.sizeX * tileWidth, .y = tileSize.sizeY * tileHeight };
|
||||
ecs_set_ptr(ECS, e, Size, &size);
|
||||
ecs_set(ECS, e, Position, {
|
||||
@@ -117,7 +117,7 @@ bool initTreesLayer(BzTileMap *map, BzTileLayer *layer) {
|
||||
f32 sizeY = tileset->tileHeight;
|
||||
f32 posX = layer->offsetX + x * sizeX;
|
||||
f32 posY = layer->offsetY + y * sizeY;
|
||||
ecs_entity_t e = entityCreate(ECS);
|
||||
ecs_entity_t e = entityCreateEmpty();
|
||||
SpatialGridID gridID = bzSpatialGridInsert(game->entityGrid, &e, posX, posY, sizeX, sizeY);
|
||||
ecs_set(ECS, e, SpatialGridID, {gridID});
|
||||
posX += sizeX * 0.5f;
|
||||
@@ -135,35 +135,3 @@ bool initTreesLayer(BzTileMap *map, BzTileLayer *layer) {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
ecs_entity_t createWorker(Position position, Size size, BzSpatialGrid *grid, BzTileset *tileset, BzTile gid) {
|
||||
ecs_entity_t e = entityCreate(ECS);
|
||||
ecs_set_ptr(ECS, e, Position, &position);
|
||||
ecs_set_ptr(ECS, e, Size, &size);
|
||||
BzSpatialGridID spatialID = bzSpatialGridInsert(grid, &e,
|
||||
position.x, position.y,
|
||||
size.x, size.y);
|
||||
ecs_set(ECS, e, SpatialGridID, {spatialID});
|
||||
ecs_set(ECS, e, Rotation, {0.0f});
|
||||
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,
|
||||
.animType = ANIM_IDLE,
|
||||
|
||||
.sequence = entityGetAnimationSequence(ENTITY_WORKER, ANIM_IDLE),
|
||||
.tileset = tileset,
|
||||
.curFrame = 0,
|
||||
.elapsed = 0.0f,
|
||||
});
|
||||
ecs_set(ECS, e, UnitAction, {NULL, NULL});
|
||||
ecs_add_id(ECS, e, Selectable);
|
||||
ecs_add_id(ECS, e, Unit);
|
||||
ecs_set(ECS, e, Worker, {
|
||||
.collectSpeed = 0.8f,
|
||||
.depositSpeed = 0.2f,
|
||||
.carryCapacity = 5,
|
||||
});
|
||||
return e;
|
||||
}
|
||||
|
||||
@@ -14,7 +14,4 @@ bool initBuildingsLayer(BzTileMap *map, BzTileLayer *layer);
|
||||
|
||||
bool initTreesLayer(BzTileMap *map, BzTileLayer *layer);
|
||||
|
||||
ecs_entity_t createWorker(Position position, Size size, BzSpatialGrid *grid, BzTileset *tileset, BzTile gid);
|
||||
|
||||
|
||||
#endif //PIXELDEFENSE_MAP_INITIALIZATION_H
|
||||
|
||||
Reference in New Issue
Block a user