Place buildings
This commit is contained in:
81
game/main.c
81
game/main.c
@@ -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();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user