#include "GameScene.h" #include "core/Time.h" GameScene::GameScene() { } GameScene::~GameScene() { } std::unique_ptr GameScene::createUIManager() { // 默认创建普通的GameUIManager return std::make_unique( [this](const std::string& sceneName) { if (m_eventCallback) { SceneEvent event{SceneEventType::ChangeScene, sceneName}; 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(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData){ m_renderer = renderer; m_uiRenderer = uiRenderer; m_coreData = coreData; // 使用工厂方法创建UIManager m_gameUIManager = createUIManager(); m_gameUIManager->init(); m_gameUIManager->setCallback([this]() { this->restartGame(); }); m_boardRenderer = std::make_unique(WIDTH, HEIGHT, renderer, textureManager); m_gameSession = std::make_unique(); m_CoordinateConverter = std::make_unique(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_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(); 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); }