我有一段时间没有使用 C++,所以我决定承担一个小项目来重新熟悉它。我正在尝试制作中国跳棋游戏,但我没有使用 C++ 进行 GUI 设计的经验。有没有一种真正简单的方法来制作网格(即位图六边形或其他东西),当点击时,会给我我点击的那个的索引号?如果有人有任何关于如何做到这一点的例子,即使只有一个二维正方形网格,那也会很有帮助。任何帮助表示赞赏,谢谢!
5 回答
取决于你采取什么简单的方法。
Qt 可能是一种简单的方法,但需要时间来适应它(如果你不习惯的话)。
如果我是你,我会使用创建一个简单的 winapi 应用程序,为消息编写处理程序WM_CLICK
并添加一个简单的网格渲染器。
它会因您的 GUI 工具包而异。但是,我相信两种最有可能的方式可能是在
存储每个正方形、孔或任何您尝试为游戏单击的坐标,并让 click 事件处理程序使用它获得的坐标来确定单击了哪个正方形。
让每个方块都有自己的小部件。这样,当它被点击时,得到点击事件的是方块本身,它可以以一种很好的、面向对象的方式处理。但是,这意味着中国跳棋游戏需要大量的小部件。
第一件事是决定你要为你的应用使用哪个 API。吗?SDL? 赢32?OpenGL?我的建议是使用 Qt 及其 QGraphicsView 类(您可以从使用 QGraphicsView 的 Qt 示例应用程序之一开始并对其进行修改以适合您的口味)。
通常,GUI takeit 将允许您覆盖(例如通过虚拟函数)代表板的小部件的事件处理程序,因此您可以通过调用您自己的一些函数来处理鼠标单击事件,例如 MouseClicked(int x, int y ),其中处理程序还将为您提供鼠标坐标 x 和 y。
如果它是一个矩形网格,只需将坐标除以单元格宽度(以像素为单位)。
如果它是六边形单元格,那么弄清楚将更加困难。我想您可以首先定义一个矩形网格,标记六边形的矩形中心,然后在边缘周围的四个三角形区域内添加更多检测。不过,游戏可能仅使用矩形单元定义就相当有用,只是忽略了三角形边缘。
使用单行数学将鼠标坐标转换为游戏网格坐标很容易:
POINT grid_loc = POINT(click.x / grid.cell.width, click.y / grid.cell.height);
当然,这是一个从零开始的游戏网格。