mirror of
https://github.com/zhenyan121/SporeBG-Conid.git
synced 2026-04-10 06:14:08 +08:00
Add CoordinateConverter to get logical postion
This commit is contained in:
38
src/graphics/CoordinateConverter.cpp
Normal file
38
src/graphics/CoordinateConverter.cpp
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#include "CoordinateConverter.h"
|
||||||
|
|
||||||
|
CoordinateConverter::CoordinateConverter(SDL_Renderer* renderer) : m_renderer(renderer) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
CoordinateConverter::~CoordinateConverter() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<std::pair<int, int>> CoordinateConverter::ScreenToBoard(float screenX, float screenY, BoardArea area) {
|
||||||
|
// 将窗口坐标转为逻辑坐标
|
||||||
|
float logicalX, logicalY;
|
||||||
|
SDL_RenderCoordinatesFromWindow(
|
||||||
|
m_renderer,
|
||||||
|
static_cast<float>(screenX),
|
||||||
|
static_cast<float>(screenY),
|
||||||
|
&logicalX,
|
||||||
|
&logicalY
|
||||||
|
);
|
||||||
|
int mouseX = static_cast<int>(logicalX);
|
||||||
|
int mouseY = static_cast<int>(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<int, int>{row, col};
|
||||||
|
}
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
15
src/graphics/CoordinateConverter.h
Normal file
15
src/graphics/CoordinateConverter.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "utils/Config.h"
|
||||||
|
#include <SDL3/SDL.h>
|
||||||
|
#include <utility>
|
||||||
|
#include <optional>
|
||||||
|
class CoordinateConverter {
|
||||||
|
public:
|
||||||
|
CoordinateConverter(SDL_Renderer* renderer);
|
||||||
|
~CoordinateConverter();
|
||||||
|
// 将物理坐标转化成逻辑坐标
|
||||||
|
std::optional<std::pair<int, int>> ScreenToBoard(float screenX, float screenY, BoardArea aera);
|
||||||
|
|
||||||
|
private:
|
||||||
|
SDL_Renderer* m_renderer;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user