Using WindowManager to begin and end frame

This commit is contained in:
2025-12-19 22:47:18 +08:00
parent c8ab71738a
commit 96b005e2ef
9 changed files with 19 additions and 11 deletions

View File

@@ -11,6 +11,10 @@ cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COM
ninja
```
## 目前更新计划
- 使用位图渲染文字移除TTF
## 待添加玩法
- 生命值
- 道具(直接消灭一个孢子之类的)

View File

@@ -53,10 +53,13 @@ SDL_AppResult GameApplication::handleInputEvent(SDL_Event* event) {
m_sceneManager->handleClickCurrent(input.mouseCilckOn);
}
m_sceneManager->handleMousePosition(input.mouseCurrentPosition);
m_windowManager->setFullscreen(input.isFullscreen);
return result;
}
void GameApplication::run() {
m_windowManager->Clear();
m_sceneManager->updateCurrent();
m_sceneManager->renderCurrent();
m_windowManager->Present();
}

View File

@@ -36,7 +36,7 @@ TTF_Font* FontManager::loadFont(const std::string& fontID, int ptSize) {
// 字体加载失败,抛出异常
throw std::runtime_error("无法加载字体: " + fontID);
}
TTF_SetFontHinting(font, TTF_HINTING_MONO); // 单色渲染,不抗锯齿
// 将新加载的字体存入缓存
m_fonts[key] = font;
return font;

View File

@@ -91,7 +91,7 @@ TextRenderer::CachedText TextRenderer::createAndCacheTexture(const std::string&
SDL_Log("错误:无法创建纹理\n");
return result;
}
SDL_SetTextureScaleMode(texture, SDL_SCALEMODE_NEAREST);
// 保存结果
result.texture = texture;
result.width = width;

View File

@@ -68,7 +68,7 @@ protected:
SDL_Renderer* m_renderer; ///< SDL 渲染器指针
EventCallback m_eventCallback; ///< 场景事件回调函数
void beginFrame() {
/*void beginFrame() {
if (!m_renderer) {
SDL_Log("Renderer is null in beginFrame!");
return;
@@ -77,12 +77,12 @@ protected:
SDL_SetRenderDrawColor(m_renderer, 255, 255, 255, 255);
SDL_RenderClear(m_renderer);
//std::cout << "begin frame\n";
}
}*/
void endFrame() {
/*void endFrame() {
// 提交到屏幕
//std::cout << "end frame\n";
SDL_RenderPresent(m_renderer);
}
}*/
};

View File

@@ -125,7 +125,7 @@ private:
std::stack<std::shared_ptr<Scene>> m_scenes; ///< 场景栈,存储场景层级关系(使用 shared_ptr
std::unordered_map<std::string, std::shared_ptr<Scene>> m_sceneCache; ///< 场景缓存,按名字缓存场景以便切换时复用
std::unordered_map<std::string, std::function<std::shared_ptr<Scene>()>> m_sceneFactories; ///< 场景工厂映射,按名字动态创建场景实例
/**
* @brief 获取窗口尺寸的辅助方法
* @return 返回 {宽度, 高度},如果获取失败则返回默认值 {1600, 900}

View File

@@ -33,7 +33,7 @@ void GameScene::update() {
}
void GameScene::render() {
beginFrame();
m_boardRenderer->drawBackground();
m_boardRenderer->drawBoard();
@@ -41,7 +41,7 @@ void GameScene::render() {
m_boardRenderer->drawMovementRange();
m_boardRenderer->renderBlackOverlay();
m_uiRenderer->renderUI(m_gameUIManager->getUIRenderData());
endFrame();
}
void GameScene::handleClick(float screenX, float screenY) {

View File

@@ -31,11 +31,11 @@ void MainMenuScene::update() {
}
void MainMenuScene::render() {
beginFrame();
// 渲染场景内容
const UIRenderData& uiRenderData = m_mainMenuUIManager->getUIRenderData();
m_uiRenderer->renderUI(uiRenderData);
endFrame();
}
void MainMenuScene::handleClick(float x, float y) {

View File

@@ -7,6 +7,7 @@ struct GameConfig {
int windowHeight = 900;
std::string windowTitle = "孢子棋";
bool vsync = true;
int uiScale = 2;
} ;
// 获取棋盘渲染区域信息(用于坐标转换)