ADD: Basic StageSystem

This commit is contained in:
sebastian 2026-02-13 21:47:02 +01:00
parent ce2858534f
commit 150fbca06c
9 changed files with 83 additions and 5 deletions

View File

@ -171,6 +171,10 @@ add_executable(Dicewars_Siedler src/main.cpp
src/game/hexWorld/gameplay/TurnSystem.cpp src/game/hexWorld/gameplay/TurnSystem.cpp
src/game/hexWorld/gameplay/TurnSystem.h src/game/hexWorld/gameplay/TurnSystem.h
src/game/hexWorld/gameplay/TurnState.h src/game/hexWorld/gameplay/TurnState.h
src/engine/layer/entities/ModelState.cpp
src/engine/layer/entities/ModelState.h
src/engine/layer/entities/ModelStage.cpp
src/engine/layer/entities/ModelStage.h
) )
target_compile_options(Dicewars_Siedler PRIVATE target_compile_options(Dicewars_Siedler PRIVATE

View File

@ -5,15 +5,35 @@
#ifndef MODELCOMPONENT_H #ifndef MODELCOMPONENT_H
#define MODELCOMPONENT_H #define MODELCOMPONENT_H
#include <memory> #include <memory>
#include <utility>
#include "Component.h" #include "Component.h"
#include "../../layer/entities/ModelStage.h"
#include "../../renderer/model/TexturedModel.h" #include "../../renderer/model/TexturedModel.h"
class ModelComponent: public Component { class ModelComponent: public Component {
public: public:
std::shared_ptr<TexturedModel> model; ModelComponent(const std::vector<ModelStage>& stages) : stages(stages) {};
ModelComponent(std::shared_ptr<TexturedModel> model) : model(std::move(model)) {}; ModelComponent(std::shared_ptr<TexturedModel> model) {
activeModel = std::move(model);
}
void updateStage() {
for (const auto& stage : stages) {
if (stage.isActive()) {
activeModel = stage.model;
return;
}
}
}
[[nodiscard]] std::shared_ptr<TexturedModel> getActiveModel() const {
return activeModel;
}
private:
std::vector<ModelStage> stages;
std::shared_ptr<TexturedModel> activeModel;
}; };

View File

@ -9,6 +9,7 @@ void RenderSystem::render(EntityManager &entityManager, MasterRenderer &renderer
auto transform = entityManager.getComponent<TransformComponent>(id); auto transform = entityManager.getComponent<TransformComponent>(id);
auto model = entityManager.getComponent<ModelComponent>(id); auto model = entityManager.getComponent<ModelComponent>(id);
model->updateStage();
auto tileRenderingComponent = entityManager.getComponent<TileRenderComponent>(id); auto tileRenderingComponent = entityManager.getComponent<TileRenderComponent>(id);
if (!transform || !model) continue; if (!transform || !model) continue;
@ -16,7 +17,7 @@ void RenderSystem::render(EntityManager &entityManager, MasterRenderer &renderer
if (tileRenderingComponent) { if (tileRenderingComponent) {
renderer.submitTerrainTile(transform, model, tileRenderingComponent); renderer.submitTerrainTile(transform, model, tileRenderingComponent);
} else { } else {
Entity entity = Entity(model->model, transform->position, transform->rotation.x, transform->rotation.y, transform->rotation.z, transform->scale); Entity entity = Entity(model->getActiveModel(), transform->position, transform->rotation.x, transform->rotation.y, transform->rotation.z, transform->scale);
renderer.submitEntity(std::make_unique<Entity>(entity)); renderer.submitEntity(std::make_unique<Entity>(entity));
} }

View File

@ -0,0 +1,5 @@
//
// Created by sebastian on 13.02.26.
//
#include "ModelStage.h"

View File

@ -0,0 +1,22 @@
//
// Created by sebastian on 13.02.26.
//
#ifndef DICEWARS_SIEDLER_MODELSTAGE_H
#define DICEWARS_SIEDLER_MODELSTAGE_H
#include <functional>
#include <string>
#include "../../renderer/model/TexturedModel.h"
class ModelStage {
public:
std::string name;
std::shared_ptr<TexturedModel> model;
// Trigger-Funktion: Gibt true zurück, wenn dieser State aktiv sein sollte
std::function<bool()> isActive;
};
#endif //DICEWARS_SIEDLER_MODELSTAGE_H

View File

@ -0,0 +1,5 @@
//
// Created by sebastian on 13.02.26.
//
#include "ModelState.h"

View File

@ -0,0 +1,22 @@
//
// Created by sebastian on 13.02.26.
//
#ifndef DICEWARS_SIEDLER_MODELSTATE_H
#define DICEWARS_SIEDLER_MODELSTATE_H
#include <functional>
#include <string>
class ModelState {
public:
std::string name;
std::string modelPath;
std::string texturePath;
// Trigger-Function: Returns true when this state should be active
std::function<bool()> isActive;
};
#endif //DICEWARS_SIEDLER_MODELSTATE_H

View File

@ -33,7 +33,7 @@ void MasterRenderer::submitEntity(std::unique_ptr<Entity> entity) {
void MasterRenderer::submitTerrainTile(std::shared_ptr<TransformComponent> transform, std::shared_ptr<ModelComponent> model, std::shared_ptr<TileRenderComponent> terrainTileComponent) { void MasterRenderer::submitTerrainTile(std::shared_ptr<TransformComponent> transform, std::shared_ptr<ModelComponent> model, std::shared_ptr<TileRenderComponent> terrainTileComponent) {
TerrainRenderingData terrain = TerrainRenderingData(std::move(transform), std::move(model), std::move(terrainTileComponent)); TerrainRenderingData terrain = TerrainRenderingData(std::move(transform), std::move(model), std::move(terrainTileComponent));
terrainTiles[terrain.modelComponent->model.get()].push_back(std::make_unique<TerrainRenderingData>(std::move(terrain))); terrainTiles[terrain.modelComponent->getActiveModel().get()].push_back(std::make_unique<TerrainRenderingData>(std::move(terrain)));
} }

View File

@ -72,7 +72,6 @@ size_t GameMode::getPlayerCount() const {
} }
bool GameMode::hasTurn(PlayerID playerID, int turn) const { bool GameMode::hasTurn(PlayerID playerID, int turn) const {
printf("Turn: %d, PlayerCount: %lu, playerID: %u\n, Modulo Result: %lu", turn, getPlayerCount(), playerID, turn % getPlayerCount());
return turn % static_cast<int>(getPlayerCount()) == static_cast<int>(playerID); return turn % static_cast<int>(getPlayerCount()) == static_cast<int>(playerID);
} }