mirror of
https://github.com/zhenyan121/SporeBG-Conid.git
synced 2026-04-10 06:14:08 +08:00
182 lines
6.2 KiB
C++
182 lines
6.2 KiB
C++
#include "GameScene.h"
|
||
#include "core/Time.h"
|
||
GameScene::GameScene() {
|
||
|
||
}
|
||
|
||
GameScene::~GameScene() {
|
||
|
||
}
|
||
|
||
std::unique_ptr<GameUIManager> GameScene::createUIManager() {
|
||
// 默认创建普通的GameUIManager
|
||
return std::make_unique<GameUIManager>(
|
||
[this](SceneType sceneType) {
|
||
if (m_eventCallback) {
|
||
SceneEvent event{SceneEventType::ChangeScene, sceneType};
|
||
m_eventCallback(event);
|
||
}
|
||
}
|
||
);
|
||
}
|
||
|
||
|
||
bool GameScene::preHandleClick(int logicalX, int logicalY) {
|
||
// 默认实现:先处理UI点击
|
||
if (m_gameUIManager && m_gameUIManager->handleClick(logicalX, logicalY)) {
|
||
return true; // UI已处理点击
|
||
}
|
||
|
||
// 检查游戏状态
|
||
if (m_gameSession->getGameState() != GameState::GAME_RUNING) {
|
||
SDL_Log("Game is not running, click ignored.");
|
||
return true; // 游戏未运行,不处理点击
|
||
}
|
||
|
||
return false; // 继续处理游戏点击
|
||
}
|
||
|
||
void GameScene::postHandleClick() {
|
||
|
||
// 默认实现:更新UI和渲染器状态
|
||
m_gameUIManager->updateActionType(m_gameSession->getCurrentActionType());
|
||
m_boardRenderer->updateMovementRange(m_gameSession->getSelectedPiece(), m_gameSession->getCurrentActionType());
|
||
m_boardRenderer->updateSelectedPiece(m_gameSession->getSelectedPiece());
|
||
m_gameUIManager->updateGameState(m_gameSession->getGameState());
|
||
m_boardRenderer->setGameState(m_gameSession->getGameState());
|
||
m_gameUIManager->updatePlayerTurn(m_gameSession->getCurrentPlayer());
|
||
|
||
}
|
||
|
||
void GameScene::handleBoardClick(int row, int col) {
|
||
// 处理棋盘点击逻辑
|
||
m_gameSession->handleCoordinateInput(row, col);
|
||
m_gameSession->printBoard();
|
||
}
|
||
|
||
void GameScene::onEnter(CoreData* coreData){
|
||
coreData->renderer;
|
||
coreData->uiRenderer;
|
||
m_coreData = coreData;
|
||
// 使用工厂方法创建UIManager
|
||
m_gameUIManager = createUIManager();
|
||
m_gameUIManager->init();
|
||
m_gameUIManager->setCallback([this]() {
|
||
this->restartGame();
|
||
});
|
||
|
||
m_boardRenderer = std::make_unique<BoardRenderer>(UI::LogicalWidth, UI::LogicalHeight, coreData->renderer, coreData->textureManager);
|
||
m_gameSession = std::make_unique<GameSession>();
|
||
m_CoordinateConverter = std::make_unique<CoordinateConverter>(coreData->renderer);
|
||
m_gameSession->initialize();
|
||
|
||
m_boardRenderer->setBoard(m_gameSession->getBoard());
|
||
|
||
m_gameSession->setGamePieceEventCallback(
|
||
[this](GamePieceEvent evnet, int fromRow, int fromCol, int toRow, int toCol) {
|
||
std::cout << "GameScene: recevie the event piece at " << fromRow << " " << fromCol << "\n";
|
||
m_boardRenderer->handleGamePieceEvent(evnet, fromRow, fromCol, toRow, toCol);
|
||
}
|
||
);
|
||
|
||
|
||
}
|
||
|
||
void GameScene::update() {
|
||
updatePieceInfo();
|
||
m_boardRenderer->update(Time::deltaTime());
|
||
}
|
||
|
||
void GameScene::renderWorld() {
|
||
|
||
m_boardRenderer->drawBackground();
|
||
m_boardRenderer->drawBoard();
|
||
|
||
m_boardRenderer->drawPiece(m_gameSession->getSelectedPiece());
|
||
m_boardRenderer->drawMovementRange();
|
||
m_boardRenderer->renderBlackOverlay();
|
||
|
||
|
||
}
|
||
|
||
void GameScene::renderUI() {
|
||
m_coreData->uiRenderer->renderUI(m_gameUIManager->getUIRenderData());
|
||
}
|
||
|
||
void GameScene::handleClick(int logicalX, int logicalY) {
|
||
// 1. 预处理(UI点击等)
|
||
if (preHandleClick(logicalX, logicalY)) {
|
||
return;
|
||
}
|
||
|
||
if (m_gameSession->getGameState() != GameState::GAME_RUNING) {
|
||
SDL_Log("Game is not running, click ignored.");
|
||
return;
|
||
}
|
||
auto click = m_CoordinateConverter->ScreenToBoard(logicalX, logicalY, m_boardRenderer->getBoardArea());
|
||
if (click) {
|
||
auto [row, col] = click.value();
|
||
handleBoardClick(row, col);
|
||
|
||
// 3. 后处理(更新UI状态等)
|
||
postHandleClick();
|
||
/*SDL_Log("try to updateActionType\n");
|
||
m_gameUIManager->updateActionType( m_gameSession->getCurrentActionType());
|
||
SDL_Log("tyr to updateMovementRange\n");
|
||
m_boardRenderer->updateMovementRange(m_gameSession->getSelectedPiece(), m_gameSession->getCurrentActionType());
|
||
SDL_Log("tyr to updateGameState\n");
|
||
m_gameUIManager->updateGameState(m_gameSession->getGameState());
|
||
m_boardRenderer->setGameState(m_gameSession->getGameState());
|
||
*/
|
||
} else {
|
||
SDL_Log("invail cilck aera!");
|
||
}
|
||
m_coreData->debugData.round = m_gameSession->getRound();
|
||
}
|
||
|
||
|
||
void GameScene::restartGame() {
|
||
m_gameSession = std::make_unique<GameSession>();
|
||
m_gameSession->initialize();
|
||
m_boardRenderer->setBoard(m_gameSession->getBoard());
|
||
m_boardRenderer->updateMovementRange(std::nullopt, ActionType::GROW);
|
||
m_boardRenderer->updateSelectedPiece(std::nullopt);
|
||
m_gameUIManager->updateActionType(ActionType::GROW);
|
||
m_gameUIManager->updateGameState(GameState::GAME_RUNING);
|
||
m_boardRenderer->setGameState(GameState::GAME_RUNING);
|
||
|
||
m_gameSession->setGamePieceEventCallback(
|
||
[this](GamePieceEvent evnet, int fromRow, int fromCol, int toRow, int toCol) {
|
||
std::cout << "GameScene: recevie the event piece at " << fromRow << " " << fromCol << "\n";
|
||
m_boardRenderer->handleGamePieceEvent(evnet, fromRow, fromCol, toRow, toCol);
|
||
}
|
||
);
|
||
|
||
}
|
||
|
||
void GameScene::updatePieceInfo() {
|
||
int mouseX = m_coreData->inputState.mouseCurrentLogicalPosition.x;
|
||
int mouseY = m_coreData->inputState.mouseCurrentLogicalPosition.y;
|
||
auto click = m_CoordinateConverter->ScreenToBoard(mouseX, mouseY, m_boardRenderer->getBoardArea());
|
||
|
||
if (click == std::nullopt) {
|
||
m_gameUIManager->setLabel("PieceInfoLabel", false);
|
||
return;
|
||
}
|
||
|
||
auto [row, col] = click.value();
|
||
|
||
PieceInfo pieceInfo = m_gameSession->getPieceInfo(row, col);
|
||
if (!pieceInfo.hasPiece) {
|
||
m_gameUIManager->setLabel("PieceInfoLabel", false);
|
||
return;
|
||
}
|
||
std::string text = "HP: " + std::to_string(pieceInfo.HP) + "\n" + "ATK: " + std::to_string(pieceInfo.ATK);
|
||
m_gameUIManager->setLabel("PieceInfoLabel", true);
|
||
m_gameUIManager->setLabel("PieceInfoLabel", text);
|
||
|
||
m_gameUIManager->setLabel("PieceInfoLabel", mouseX + 5, mouseY + 5);
|
||
|
||
|
||
|
||
} |