diff --git a/src/graphics/GameRenderer.cpp b/src/graphics/GameRenderer.cpp index 89395a2..2a35785 100644 --- a/src/graphics/GameRenderer.cpp +++ b/src/graphics/GameRenderer.cpp @@ -1,34 +1,47 @@ -#include "BoardRenderer.h" - -Renderer::Renderer(int WIDTH, int HEIGHT) : m_Width(WIDTH), m_Height(HEIGHT) { +#include "GameRenderer.h" +#include +GameRenderer::GameRenderer(int WIDTH, int HEIGHT, SDL_Renderer* renderer) : m_Width(WIDTH), m_Height(HEIGHT), m_renderer(renderer) { m_cellSize = HEIGHT / m_boardRow; } -Renderer::~Renderer() { +GameRenderer::~GameRenderer() { } -bool Renderer::initialize() { - +bool GameRenderer::initialize() { + return true; +} + +void GameRenderer::beginFrame() { + if (!m_renderer) { + std::cout << "ERROR: Renderer is NULL!\n"; + return; + } + // 清屏为白色色背景 + SDL_SetRenderDrawColor(m_renderer, 0, 255, 0, 255); + SDL_RenderClear(m_renderer); + //std::cout << "begin frame\n"; + // 临时测试:画个红框 + SDL_SetRenderDrawColor(m_renderer, 255, 0, 0, 255); + SDL_FRect test{100, 100, 200, 200}; + SDL_RenderFillRect(m_renderer, &test); +} + +void GameRenderer::endFrame() { + // 提交到屏幕 + //std::cout << "end frame\n"; + SDL_RenderPresent(m_renderer); } - - -void Renderer::render() { - - - drawBoard(); - - - +void GameRenderer::drawBackground() { } -void Renderer::drawBoard() { +void GameRenderer::drawBoard() { auto area = getBoardArea(); @@ -58,7 +71,7 @@ for (int row = 0; row < area.rows; ++row) { } -ui::BoardArea Renderer::getBoardArea() const { +BoardArea GameRenderer::getBoardArea() const { return { (m_Width - m_cellSize * m_boardCOL) / 2, (m_Height - m_cellSize * m_boardRow) / 2, @@ -68,6 +81,3 @@ ui::BoardArea Renderer::getBoardArea() const { }; } -SDL_Renderer* Renderer::getSDLRenderer() const { - return m_renderer; -} \ No newline at end of file diff --git a/src/graphics/GameRenderer.h b/src/graphics/GameRenderer.h index dc886b6..5a999b4 100644 --- a/src/graphics/GameRenderer.h +++ b/src/graphics/GameRenderer.h @@ -1,11 +1,10 @@ #pragma once -#include "UIType.h" +#include "utils/Config.h" #include -class Renderer +class GameRenderer { private: - SDL_Window* m_window = nullptr; SDL_Renderer* m_renderer = nullptr; int m_Width; int m_Height; @@ -13,23 +12,29 @@ private: int m_boardRow = 7; int m_boardCOL = 7; public: - Renderer(int WIDTH, int HEIGHT); + GameRenderer(int WIDTH, int HEIGHT, SDL_Renderer* renderer); - ~Renderer(); + ~GameRenderer(); // 渲染画面 - void render(); + // 初始化加载纹理 bool initialize(); + // 帧控制 + void beginFrame(); + void endFrame(); - // 绘制棋盘 + // 渲染函数 + // 绘制背景 + void drawBackground(); + //绘制棋盘 void drawBoard(); - ui::BoardArea getBoardArea() const; + BoardArea getBoardArea() const; - SDL_Renderer* getSDLRenderer() const; + }; diff --git a/src/scenes/base/Scene.h b/src/scenes/base/Scene.h index e08dc84..b01484d 100644 --- a/src/scenes/base/Scene.h +++ b/src/scenes/base/Scene.h @@ -10,11 +10,14 @@ public: virtual ~Scene() = default; // 空实现,可选择性重写 - virtual void onEnter(){}; + virtual void onEnter(SDL_Renderer* renderer, int width, int height){}; virtual void onExit(){}; virtual void update() = 0; - virtual void render(SDL_Renderer* renderer) = 0; + // 暂时先直接传入SDLrender,以后在改,理论上来说scene是应该不知道SDlrenderer的 + virtual void render() = 0; + // 处理点击 + virtual void handleClick(float x, float y) = 0; }; diff --git a/src/scenes/base/SceneManager.cpp b/src/scenes/base/SceneManager.cpp index 9d33ebe..2fa4472 100644 --- a/src/scenes/base/SceneManager.cpp +++ b/src/scenes/base/SceneManager.cpp @@ -1,11 +1,31 @@ #include "SceneManager.h" -SceneManager::SceneManager() { - +SceneManager::SceneManager(SDL_Renderer* renderer) { + m_scene = std::make_unique(); + m_scene->onEnter(renderer, 1600, 900); } SceneManager::~SceneManager() { while (!m_scenes.empty()) { m_scenes.pop(); } +} + +void SceneManager::PushScene(const std::string& sceneName, std::unique_ptr scene) { + +} + + + +void SceneManager::handleClickCurrent(std::pair clickon) { + auto [screenX, screenY] = clickon; + m_scene->handleClick(screenX, screenY); +} + +void SceneManager::updateCurrent() { + m_scene->update(); +} + +void SceneManager::renderCurrent() { + m_scene->render(); } \ No newline at end of file diff --git a/src/scenes/base/SceneManager.h b/src/scenes/base/SceneManager.h index 03e42e9..566c472 100644 --- a/src/scenes/base/SceneManager.h +++ b/src/scenes/base/SceneManager.h @@ -1,21 +1,26 @@ #pragma once #include "Scene.h" +#include "scenes/gameplay/GameScene.h" +#include #include #include #include #include class SceneManager { public: - SceneManager(); + SceneManager(SDL_Renderer* renderer); ~SceneManager(); void PushScene(const std::string& sceneName, std::unique_ptr scene); - void PopScene(); - void ChangeScene(const std::string& sceneName, std::unique_ptr scene); - + // void PopScene(); + //void ChangeScene(const std::string& sceneName, std::unique_ptr scene); + void handleClickCurrent(std::pair clickon); + void updateCurrent(); + void renderCurrent(); private: + std::unique_ptr m_scene; // 用栈的形式来存储场景 std::stack> m_scenes; std::unordered_map> m_sceneCache; diff --git a/src/scenes/gameplay/GameScene.cpp b/src/scenes/gameplay/GameScene.cpp new file mode 100644 index 0000000..b7a810d --- /dev/null +++ b/src/scenes/gameplay/GameScene.cpp @@ -0,0 +1,38 @@ +#include "GameScene.h" + +GameScene::GameScene() { + +} + +GameScene::~GameScene() { + +} + +void GameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT) { + m_renderer = std::make_unique(WIDTH, HEIGHT, renderer); + m_gameSession = std::make_unique(); + m_CoordinateConverter = std::make_unique(renderer); + m_gameSession->initialize(); +} + +void GameScene::update() { + +} + +void GameScene::render() { + m_renderer->beginFrame(); + m_renderer->drawBackground(); + m_renderer->drawBoard(); + m_renderer->endFrame(); +} + +void GameScene::handleClick(float screenX, float screenY) { + auto click = m_CoordinateConverter->ScreenToBoard(screenX, screenY, m_renderer->getBoardArea()); + if (click) { + auto [row, col] = click.value(); + m_gameSession->handleCoordinateInput(row, col); + m_gameSession->printBoard(); + } else { + SDL_Log("invail cilck aera!"); + } +} diff --git a/src/scenes/gameplay/GameScene.h b/src/scenes/gameplay/GameScene.h new file mode 100644 index 0000000..565569d --- /dev/null +++ b/src/scenes/gameplay/GameScene.h @@ -0,0 +1,21 @@ +#pragma once +#include "scenes/base/Scene.h" +#include "graphics/GameRenderer.h" +#include "graphics/CoordinateConverter.h" +#include "game/GameSession.h" +#include +class GameScene : public Scene { +public: + GameScene(); + ~GameScene(); + + void onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT) override; + + void update() override; + void render() override; + void handleClick(float screenX, float screenY) override; +private: + std::unique_ptr m_renderer; + std::unique_ptr m_CoordinateConverter; + std::unique_ptr m_gameSession; +}; \ No newline at end of file diff --git a/src/ui/UIType.h b/src/ui/UIType.h index 31a7b60..efe00ff 100644 --- a/src/ui/UIType.h +++ b/src/ui/UIType.h @@ -1,10 +1,5 @@ #pragma once namespace ui { - // 获取棋盘渲染区域信息(用于坐标转换) - struct BoardArea { - int x, y; // 左上角像素坐标 - int cellSize; // 每格像素大小 - int rows, cols; // 行列数 - }; + } \ No newline at end of file diff --git a/src/utils/Config.h b/src/utils/Config.h index b3669d8..e391b03 100644 --- a/src/utils/Config.h +++ b/src/utils/Config.h @@ -7,4 +7,11 @@ struct GameConfig { int windowHeight = 900; std::string windowTitle = "孢子棋"; bool vsync = true; -} ; \ No newline at end of file +} ; + +// 获取棋盘渲染区域信息(用于坐标转换) +struct BoardArea { + int x, y; // 左上角像素坐标 + int cellSize; // 每格像素大小 + int rows, cols; // 行列数 +}; \ No newline at end of file