Place buildings

This commit is contained in:
2023-11-11 07:01:49 +01:00
parent 7513ecc7eb
commit 1908150635
8 changed files with 173 additions and 27 deletions

View File

@@ -1,12 +1,12 @@
#include <stdio.h>
#include <flecs.h>
#define BZ_ENTRYPOINT
#include <breeze.h>
#include "utils/buildings.h"
#include <raylib.h>
#include <rlImGui.h>
#include "utils/building_types.h"
#include "components.h"
typedef enum Layers {
@@ -31,6 +31,7 @@ typedef struct Game {
} Game;
static Game GAME = {};
static int selectedBuilding = 0;
bool handleGameObjects(BzTileObjectGroup *objectLayer, BzTileObject *objects, i32 objectCount) {
for (i32 i = 0; i < objectLayer->objectCount; i++) {
@@ -152,7 +153,40 @@ bool canBuildOn(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 sizeY) {
return true;
}
void placeBuilding(BzTileMap *map, BuildingType type, i32 posX, i32 posY, i32 sizeX, i32 sizeY) {
ECS_COMPONENT(ECS, TilePosition);
ECS_COMPONENT(ECS, TileSize);
ECS_COMPONENT(ECS, Owner);
BzTileLayer *buildingLayer = bzTileMapGetLayer(map, LAYER_BUILDINGS);
BzTileset *buildingTileset = bzTileLayerGetTileset(map, buildingLayer);
BzTile buildingTile = getBuildingTile(type);
BZ_ASSERT(buildingTile != -1);
// Create entity
ecs_entity_t e = ecs_new_id(ECS);
ecs_set(ECS, e, TilePosition, {.x=posX, .y=posY});
ecs_set(ECS, e, TileSize, {.w=sizeX, .h=sizeY});
ecs_set(ECS, e, Owner, {.playerID=BUILDINGS_PLAYER_RED});
for (i32 y = posY; y < posY + sizeY; y++) {
for (i32 x = posX; x < posX + sizeX; x++) {
BzTile layerTile = buildingTile + buildingTileset->startID;
bzTileLayerSetTile(buildingLayer, layerTile, x, y, 1, 1);
buildingTile++;
entityMap[y * buildingLayer->width + x] = e;
bzTileMapUpdateCollider(map, x, y);
}
buildingTile += buildingTileset->width - sizeX;
}
}
bool init(Game *game) {
rlImGuiSetup(true);
int screenWidth = 1280;
int screenHeight = 720;
@@ -199,11 +233,9 @@ void deinit(Game *game) {
bzTilesetDestroy(&game->terrainTileset);
bzTilesetDestroy(&game->buildingsTileset);
bzTileMapDestroy(&game->map);
rlImGuiShutdown();
}
int sizeX = 1;
int sizeY = 1;
void render(float dt, Game *game) {
Camera2D *camera = &game->camera;
@@ -227,15 +259,42 @@ void render(float dt, Game *game) {
int tileX = (int) worldPos.x / 16;
int tileY = (int) worldPos.y / 16;
bool canPlace = canBuildOn(&game->map, tileX, tileY, sizeX, sizeY);
Color placeColor = canPlace ?
(Color) {0, 255, 0, 200} :
(Color) {255, 0, 0, 200};
if (selectedBuilding) {
BzTile sizeX = 0, sizeY = 0;
getBuildingSize(selectedBuilding, &sizeX, &sizeY);
DrawRectangleLines(tileX * 16, tileY * 16, sizeX * 16, sizeY * 16, placeColor);
bool canPlace = canBuildOn(&game->map, tileX, tileY, sizeX, sizeY);
Color placeColor = canPlace ?
(Color) {0, 255, 0, 200} :
(Color) {255, 0, 0, 200};
DrawRectangleLines(tileX * 16, tileY * 16, sizeX * 16, sizeY * 16, placeColor);
if (canPlace && IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) {
placeBuilding(&game->map, selectedBuilding, tileX, tileY, sizeX, sizeY);
}
}
EndMode2D();
rlImGuiBegin();
igSetNextWindowSize((ImVec2){300, 400}, ImGuiCond_FirstUseEver);
igBegin("Debug Menu", NULL, 0);
if (igCollapsingHeader_TreeNodeFlags("BuildMenu", 0)) {
for (int i = 0; i < BUILDINGS_COUNT; i++) {
if (igSelectable_Bool(getBuildingStr(i), selectedBuilding == i, 0, (ImVec2){0,0}))
selectedBuilding = i;
}
}
if (igCollapsingHeader_TreeNodeFlags("Entities", 0)) {
}
igEnd();
igShowDemoWindow(NULL);
rlImGuiEnd();
}