From ecbf7dad9012ea37005c1d0867d85d3ca6be60b6 Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Sat, 6 Dec 2025 18:37:53 +0800 Subject: [PATCH] Add CoordinateConverter to get logical postion --- src/graphics/CoordinateConverter.cpp | 38 ++++++++++++++++++++++++++++ src/graphics/CoordinateConverter.h | 15 +++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/graphics/CoordinateConverter.cpp create mode 100644 src/graphics/CoordinateConverter.h diff --git a/src/graphics/CoordinateConverter.cpp b/src/graphics/CoordinateConverter.cpp new file mode 100644 index 0000000..a0170cb --- /dev/null +++ b/src/graphics/CoordinateConverter.cpp @@ -0,0 +1,38 @@ +#include "CoordinateConverter.h" + +CoordinateConverter::CoordinateConverter(SDL_Renderer* renderer) : m_renderer(renderer) { + +} + +CoordinateConverter::~CoordinateConverter() { + +} + +std::optional> CoordinateConverter::ScreenToBoard(float screenX, float screenY, BoardArea area) { + // 将窗口坐标转为逻辑坐标 + float logicalX, logicalY; + SDL_RenderCoordinatesFromWindow( + m_renderer, + static_cast(screenX), + static_cast(screenY), + &logicalX, + &logicalY + ); + int mouseX = static_cast(logicalX); + int mouseY = static_cast(logicalY); + // 判断是否点击在棋盘区域内 + if (mouseX < area.x || mouseX >= area.x + area.cellSize * area.cols || + mouseY < area.y || mouseY >= area.y + area.cellSize * area.rows) { + return std::nullopt; // 点击在棋盘外 + } + + // 转换为逻辑坐标 + int col = (mouseX - area.x) / area.cellSize; + int row = (mouseY - area.y) / area.cellSize; + + // 安全检查(通常不需要,但保险) + if (row >= 0 && row < area.rows && col >= 0 && col < area.cols) { + return std::pair{row, col}; + } + return std::nullopt; +} \ No newline at end of file diff --git a/src/graphics/CoordinateConverter.h b/src/graphics/CoordinateConverter.h new file mode 100644 index 0000000..81dc4aa --- /dev/null +++ b/src/graphics/CoordinateConverter.h @@ -0,0 +1,15 @@ +#pragma once +#include "utils/Config.h" +#include +#include +#include +class CoordinateConverter { +public: + CoordinateConverter(SDL_Renderer* renderer); + ~CoordinateConverter(); + // 将物理坐标转化成逻辑坐标 + std::optional> ScreenToBoard(float screenX, float screenY, BoardArea aera); + +private: + SDL_Renderer* m_renderer; +}; \ No newline at end of file