mirror of
https://github.com/zhenyan121/SporeBG-Conid.git
synced 2026-04-10 06:14:08 +08:00
The calculation process has been modified, and now it is performed directly in the gameapplication class
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
#include "GameApplication.h"
|
#include "GameApplication.h"
|
||||||
|
#include "utils/Tools.h"
|
||||||
GameApplication::GameApplication() {
|
GameApplication::GameApplication() {
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -49,10 +49,11 @@ SDL_AppResult GameApplication::handleInputEvent(SDL_Event* event) {
|
|||||||
InputState input = m_inputManager->GetInputState();
|
InputState input = m_inputManager->GetInputState();
|
||||||
if (event->type == SDL_EVENT_MOUSE_BUTTON_DOWN &&
|
if (event->type == SDL_EVENT_MOUSE_BUTTON_DOWN &&
|
||||||
event->button.button == SDL_BUTTON_LEFT) {
|
event->button.button == SDL_BUTTON_LEFT) {
|
||||||
|
auto pos = Tools::physicalToLogical(input.mouseCilckOn.first, input.mouseCilckOn.second, m_windowManager->getViewport());
|
||||||
m_sceneManager->handleClickCurrent(input.mouseCilckOn);
|
m_sceneManager->handleClickCurrent(pos);
|
||||||
}
|
}
|
||||||
m_sceneManager->handleMousePosition(input.mouseCurrentPosition);
|
auto pos = Tools::physicalToLogical(input.mouseCurrentPosition.first, input.mouseCurrentPosition.second, m_windowManager->getViewport());
|
||||||
|
m_sceneManager->handleMousePosition(pos);
|
||||||
m_windowManager->setFullscreen(input.isFullscreen);
|
m_windowManager->setFullscreen(input.isFullscreen);
|
||||||
// 改变窗口时清理旧的缓存
|
// 改变窗口时清理旧的缓存
|
||||||
if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
|
if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include "CoordinateConverter.h"
|
#include "CoordinateConverter.h"
|
||||||
#include "utils/CoordinateTools.h"
|
|
||||||
CoordinateConverter::CoordinateConverter(SDL_Renderer* renderer) : m_renderer(renderer) {
|
CoordinateConverter::CoordinateConverter(SDL_Renderer* renderer) : m_renderer(renderer) {
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -8,8 +8,8 @@ CoordinateConverter::~CoordinateConverter() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<std::pair<int, int>> CoordinateConverter::ScreenToBoard(float screenX, float screenY, BoardArea area) {
|
std::optional<std::pair<int, int>> CoordinateConverter::ScreenToBoard(int mouseX, int mouseY, BoardArea area) {
|
||||||
auto [mouseX, mouseY] = physicalToLogical(screenX, screenY, m_renderer);
|
|
||||||
// 判断是否点击在棋盘区域内
|
// 判断是否点击在棋盘区域内
|
||||||
if (mouseX < area.x || mouseX >= area.x + area.cellSize * area.cols ||
|
if (mouseX < area.x || mouseX >= area.x + area.cellSize * area.cols ||
|
||||||
mouseY < area.y || mouseY >= area.y + area.cellSize * area.rows) {
|
mouseY < area.y || mouseY >= area.y + area.cellSize * area.rows) {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ public:
|
|||||||
CoordinateConverter(SDL_Renderer* renderer);
|
CoordinateConverter(SDL_Renderer* renderer);
|
||||||
~CoordinateConverter();
|
~CoordinateConverter();
|
||||||
// 将物理坐标转化成逻辑坐标
|
// 将物理坐标转化成逻辑坐标
|
||||||
std::optional<std::pair<int, int>> ScreenToBoard(float screenX, float screenY, BoardArea aera);
|
std::optional<std::pair<int, int>> ScreenToBoard(int mouseX, int mouseY, BoardArea aera);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SDL_Renderer* m_renderer;
|
SDL_Renderer* m_renderer;
|
||||||
|
|||||||
@@ -51,13 +51,13 @@ public:
|
|||||||
* @param x 点击位置的 X 坐标
|
* @param x 点击位置的 X 坐标
|
||||||
* @param y 点击位置的 Y 坐标
|
* @param y 点击位置的 Y 坐标
|
||||||
*/
|
*/
|
||||||
virtual void handleClick(float x, float y) = 0;
|
virtual void handleClick(int logicalX, int logicalY) = 0;
|
||||||
/**
|
/**
|
||||||
* @brief 渲染鼠标位置相关内容
|
* @brief 渲染鼠标位置相关内容
|
||||||
* @param x 鼠标位置的 X 坐标
|
* @param x 鼠标位置的 X 坐标
|
||||||
* @param y 鼠标位置的 Y 坐标
|
* @param y 鼠标位置的 Y 坐标
|
||||||
*/
|
*/
|
||||||
virtual void renderMousePosition(float x, float y){};
|
virtual void renderMousePosition(int logicalX, int logicalY){};
|
||||||
/**
|
/**
|
||||||
* @brief 设置场景事件回调函数
|
* @brief 设置场景事件回调函数
|
||||||
* @param callback 场景事件回调函数
|
* @param callback 场景事件回调函数
|
||||||
|
|||||||
@@ -147,14 +147,14 @@ void SceneManager::changeScene(const std::string& sceneName) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void SceneManager::handleClickCurrent(std::pair<float, float> clickOn) {
|
void SceneManager::handleClickCurrent(std::pair<int, int> clickOn) {
|
||||||
auto [screenX, screenY] = clickOn;
|
auto [logicalX, logicalY] = clickOn;
|
||||||
if (m_scene) m_scene->handleClick(screenX, screenY);
|
if (m_scene) m_scene->handleClick(logicalX, logicalY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneManager::handleMousePosition(std::pair<float, float> mousePosition) {
|
void SceneManager::handleMousePosition(std::pair<int, int> mousePosition) {
|
||||||
auto [screenX, screenY] = mousePosition;
|
auto [logicalX, logicalY] = mousePosition;
|
||||||
if (m_scene) m_scene->renderMousePosition(screenX, screenY);
|
if (m_scene) m_scene->renderMousePosition(logicalX, logicalY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneManager::updateCurrent() {
|
void SceneManager::updateCurrent() {
|
||||||
|
|||||||
@@ -90,14 +90,14 @@ public:
|
|||||||
* @param clickOn 点击位置坐标对 {x, y}
|
* @param clickOn 点击位置坐标对 {x, y}
|
||||||
* @details 将点击事件转发给当前场景的 handleClick() 方法进行处理
|
* @details 将点击事件转发给当前场景的 handleClick() 方法进行处理
|
||||||
*/
|
*/
|
||||||
void handleClickCurrent(std::pair<float, float> clickOn);
|
void handleClickCurrent(std::pair<int, int> clickOn);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 处理当前场景的鼠标位置事件
|
* @brief 处理当前场景的鼠标位置事件
|
||||||
* @param mousePosition 鼠标位置坐标对 {x, y}
|
* @param mousePosition 鼠标位置坐标对 {x, y}
|
||||||
* @details 将鼠标位置事件转发给当前场景的 renderMousePosition() 方法进行处理
|
* @details 将鼠标位置事件转发给当前场景的 renderMousePosition() 方法进行处理
|
||||||
*/
|
*/
|
||||||
void handleMousePosition(std::pair<float, float> mousePosition);
|
void handleMousePosition(std::pair<int, int> mousePosition);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 更新当前场景
|
* @brief 更新当前场景
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ void GameScene::renderUI() {
|
|||||||
m_uiRenderer->renderUI(m_gameUIManager->getUIRenderData());
|
m_uiRenderer->renderUI(m_gameUIManager->getUIRenderData());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameScene::handleClick(float screenX, float screenY) {
|
void GameScene::handleClick(int logicalX, int logicalY) {
|
||||||
if (m_gameUIManager->handleClick(screenX, screenY)) {
|
if (m_gameUIManager->handleClick(logicalX, logicalY)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ void GameScene::handleClick(float screenX, float screenY) {
|
|||||||
SDL_Log("Game is not running, click ignored.");
|
SDL_Log("Game is not running, click ignored.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto click = m_CoordinateConverter->ScreenToBoard(screenX, screenY, m_boardRenderer->getBoardArea());
|
auto click = m_CoordinateConverter->ScreenToBoard(logicalX, logicalY, m_boardRenderer->getBoardArea());
|
||||||
if (click) {
|
if (click) {
|
||||||
auto [row, col] = click.value();
|
auto [row, col] = click.value();
|
||||||
m_gameSession->handleCoordinateInput(row, col);
|
m_gameSession->handleCoordinateInput(row, col);
|
||||||
@@ -75,8 +75,8 @@ void GameScene::handleClick(float screenX, float screenY) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameScene::renderMousePosition(float x, float y) {
|
void GameScene::renderMousePosition(int logicalX, int logicalY) {
|
||||||
m_gameUIManager->UpdateMousePositon(x, y);
|
m_gameUIManager->updateMousePositon(logicalX, logicalY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameScene::restartGame() {
|
void GameScene::restartGame() {
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ public:
|
|||||||
void update() override;
|
void update() override;
|
||||||
void renderWorld() override; // 逻辑世界
|
void renderWorld() override; // 逻辑世界
|
||||||
void renderUI() override; // 屏幕 UI
|
void renderUI() override; // 屏幕 UI
|
||||||
void handleClick(float screenX, float screenY) override;
|
void handleClick(int logicalX, int logicalYY) override;
|
||||||
|
|
||||||
void renderMousePosition(float x, float y) override;
|
void renderMousePosition(int logicalX, int logicalY) override;
|
||||||
|
|
||||||
void restartGame();
|
void restartGame();
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -44,12 +44,12 @@ void MainMenuScene::renderUI() {
|
|||||||
m_uiRenderer->renderUI(uiRenderData);
|
m_uiRenderer->renderUI(uiRenderData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenuScene::handleClick(float x, float y) {
|
void MainMenuScene::handleClick(int logicalX, int logicalY) {
|
||||||
// 处理点击事件
|
// 处理点击事件
|
||||||
m_mainMenuUIManager->handleClick(x, y);
|
m_mainMenuUIManager->handleClick(logicalX, logicalY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MainMenuScene::renderMousePosition(float x, float y) {
|
void MainMenuScene::renderMousePosition(int logicalX, int logicalY) {
|
||||||
m_mainMenuUIManager->UpdateMousePositon(x, y);
|
m_mainMenuUIManager->updateMousePositon(logicalX, logicalY);
|
||||||
}
|
}
|
||||||
@@ -13,9 +13,9 @@ public:
|
|||||||
void update() override;
|
void update() override;
|
||||||
void renderWorld() override; // 逻辑世界
|
void renderWorld() override; // 逻辑世界
|
||||||
void renderUI() override; // 屏幕 UI
|
void renderUI() override; // 屏幕 UI
|
||||||
void handleClick(float x, float y) override;
|
void handleClick(int logicalX, int logicalY) override;
|
||||||
|
|
||||||
void renderMousePosition(float x, float y) override;
|
void renderMousePosition(int logicalX, int logicalY) override;
|
||||||
private:
|
private:
|
||||||
// 其他私有成员变量和方法
|
// 其他私有成员变量和方法
|
||||||
std::unique_ptr<MainMenuUIManager> m_mainMenuUIManager = nullptr;
|
std::unique_ptr<MainMenuUIManager> m_mainMenuUIManager = nullptr;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
// 收集渲染数据
|
// 收集渲染数据
|
||||||
virtual void CollectRenderData() = 0;
|
virtual void CollectRenderData() = 0;
|
||||||
|
|
||||||
virtual void UpdateMousePositon(float x, float y) = 0;
|
virtual void updateMousePositon(int logicalX, int logicalY) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::unordered_map<int, std::unique_ptr<Button>> m_buttons;
|
std::unordered_map<int, std::unique_ptr<Button>> m_buttons;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include "GameUIManager.h"
|
#include "GameUIManager.h"
|
||||||
#include "utils/CoordinateTools.h"
|
|
||||||
GameUIManager::GameUIManager(SDL_Renderer* renderer, TextRenderer* textRenderer)
|
GameUIManager::GameUIManager(SDL_Renderer* renderer, TextRenderer* textRenderer)
|
||||||
{
|
{
|
||||||
m_renderer = renderer;
|
m_renderer = renderer;
|
||||||
@@ -50,12 +50,11 @@ void GameUIManager::CollectRenderData() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameUIManager::UpdateMousePositon(float x, float y) {
|
void GameUIManager::updateMousePositon(int logicalX, int logicalY) {
|
||||||
|
|
||||||
auto logicalPos = physicalToLogical(static_cast<float>(x), static_cast<float>(y), m_renderer);
|
|
||||||
int lx = logicalPos.first;
|
|
||||||
int ly = logicalPos.second;
|
std::string pos = std::to_string(logicalX) + " " + std::to_string(logicalY);
|
||||||
std::string pos = std::to_string(lx) + " " + std::to_string(ly);
|
|
||||||
|
|
||||||
m_labels[makeHash("MousePositionLabel")]->setText(pos);
|
m_labels[makeHash("MousePositionLabel")]->setText(pos);
|
||||||
}
|
}
|
||||||
@@ -163,10 +162,9 @@ void GameUIManager::setupUIComponents() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool GameUIManager::handleClick(float x, float y) {
|
bool GameUIManager::handleClick(int lx, int ly) {
|
||||||
auto logicalPos = physicalToLogical(static_cast<float>(x), static_cast<float>(y), m_renderer);
|
|
||||||
int lx = logicalPos.first;
|
|
||||||
int ly = logicalPos.second;
|
|
||||||
|
|
||||||
// 遍历所有按钮,检查点击位置是否在按钮范围内
|
// 遍历所有按钮,检查点击位置是否在按钮范围内
|
||||||
for (auto& [id, button] : m_buttons) {
|
for (auto& [id, button] : m_buttons) {
|
||||||
|
|||||||
@@ -16,13 +16,13 @@ public:
|
|||||||
// 收集渲染数据
|
// 收集渲染数据
|
||||||
void CollectRenderData();
|
void CollectRenderData();
|
||||||
|
|
||||||
void UpdateMousePositon(float x, float y);
|
void updateMousePositon(int logicalX, int logicalY);
|
||||||
|
|
||||||
void updateActionType(ActionType type);
|
void updateActionType(ActionType type);
|
||||||
|
|
||||||
void updateGameState(GameState state);
|
void updateGameState(GameState state);
|
||||||
|
|
||||||
bool handleClick(float x, float y);
|
bool handleClick(int logicalX, int logicalY);
|
||||||
private:
|
private:
|
||||||
std::function<void()> m_restartCallback;
|
std::function<void()> m_restartCallback;
|
||||||
void setupUIComponents();
|
void setupUIComponents();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include "MainMenuUIManager.h"
|
#include "MainMenuUIManager.h"
|
||||||
#include "utils/CoordinateTools.h"
|
|
||||||
#include "ui/base/UIWidgetFactory.h"
|
#include "ui/base/UIWidgetFactory.h"
|
||||||
MainMenuUIManager::MainMenuUIManager(SDL_Renderer* renderer,
|
MainMenuUIManager::MainMenuUIManager(SDL_Renderer* renderer,
|
||||||
TextRenderer* textRenderer,
|
TextRenderer* textRenderer,
|
||||||
@@ -47,11 +47,10 @@ void MainMenuUIManager::CollectRenderData() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenuUIManager::UpdateMousePositon(float x, float y) {
|
void MainMenuUIManager::updateMousePositon(int logicalX, int logicalY) {
|
||||||
auto logicalPos = physicalToLogical(static_cast<float>(x), static_cast<float>(y), m_renderer);
|
|
||||||
int lx = logicalPos.first;
|
|
||||||
int ly = logicalPos.second;
|
std::string pos = std::to_string(logicalX) + " " + std::to_string(logicalY);
|
||||||
std::string pos = std::to_string(lx) + " " + std::to_string(ly);
|
|
||||||
|
|
||||||
m_labels[makeHash("MousePositionLabel")]->setText(pos);
|
m_labels[makeHash("MousePositionLabel")]->setText(pos);
|
||||||
}
|
}
|
||||||
@@ -61,11 +60,11 @@ const UIRenderData& MainMenuUIManager::getUIRenderData() {
|
|||||||
return m_uiRenderData;
|
return m_uiRenderData;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainMenuUIManager::handleClick(float x, float y) {
|
void MainMenuUIManager::handleClick(int logicalX, int logicalY) {
|
||||||
auto logicPos = physicalToLogical(x, y, m_renderer);
|
|
||||||
for (auto& buttonPair : m_buttons) {
|
for (auto& buttonPair : m_buttons) {
|
||||||
SDL_Log("Handling click at logical position (%d, %d)\n", logicPos.first, logicPos.second);
|
SDL_Log("Handling click at logical position (%d, %d)\n", logicalX, logicalY);
|
||||||
if (buttonPair.second->handleCilck(logicPos.first, logicPos.second)) {
|
if (buttonPair.second->handleCilck(logicalX, logicalY)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,9 +19,9 @@ public:
|
|||||||
|
|
||||||
void CollectRenderData() override;
|
void CollectRenderData() override;
|
||||||
|
|
||||||
void UpdateMousePositon(float x, float y) override;
|
void updateMousePositon(int logicalX, int logicalY) override;
|
||||||
|
|
||||||
void handleClick(float x, float y);
|
void handleClick(int logicalX, int logicalY);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SceneEventCallback m_eventCallback;
|
SceneEventCallback m_eventCallback;
|
||||||
|
|||||||
Reference in New Issue
Block a user