我正在尝试用C#构建一个Checkers / Drafts游戏。 该项目使用Windows窗体构建。
我所做的就是分解游戏板。所以我有 一个“董事会”课程。 和“BoardSquare”类(此类在正确的位置和颜色绘制正方形)
董事会由8×8 BoardSquare构建。
我想到了这个解决方案,广场需要知道它是否为空,并且 如果它不是空的,则意味着它上面有一个“GameSoldier”。
因此,当我想将士兵移到另一个方格时,我需要点击当前 获得GameSoldier的广场,然后按目的地广场。
所以我想要做的就是在BoardSquare类中添加鼠标功能 广场的属性,如位置。有什么想法吗?
答案 0 :(得分:1)
单击电路板时,可以从EventArgs获取光标的坐标。要将这些坐标转换为电路板上的正方形,您必须将图块从左上角到右下角,跨行排列,并将它们存储在索引列表或数组中。
X坐标(在“tile”中)是Math.Floor(X_Clicked / TileWidth)
Y坐标为Math.Floor(Y_Clicked / TileHeight)
例如,如果您的图块宽50像素,高50像素,并且用户点击(329,186),那么这将是以下图块:
329/50 = 6,58 = 6
186/50 = 3,72 = 3
单击(6,3)处的图块。要将其转换为列表/数组中的索引:
x +(y * tiles_in_a_row)= 6 +(3 * 8)= 30,因此点击了Tile [30]。
请记住,这是一个从零开始的坐标系,因此第一个图块位于(0,0)。
答案 1 :(得分:1)
有几种方法可以解决这个问题,你的boardsquare类可能会妨碍简单的方法,因为它会成为焦点。
当您点击占用的棋盘广场时,它的鼠标事件会触发。它在板上的位置可以通过它的顶部/高度和左/宽来识别 有了它,你可以将它传递给板上定义的BoardSquareSelected事件处理程序。 当您单击未占用的方形鼠标位置时,x /平方宽度,y /平方高度 第一次点击被占用需要更多的逻辑,第二次不合法移动等。 你也可以看一下拖放衍生物。但就个人而言,我将摆脱将boardquare作为一个组成部分。 如果board有一个8x8的正方形数组,你使用Invalidate(rect)来避免在任何更改时重绘整个东西,你真的不需要它。然后,所有选择的东西都由董事会成员完全封装。
答案 2 :(得分:0)
您要做的是为您正在渲染的控件的MouseClick事件添加一个Eventhandler。 在该事件的EventArgs中,您将能够检索鼠标坐标。 然后,您可以将该信息与控件本身的大小相结合,以计算已单击的方块。
以下是一些更多信息:
Obtain Position/Button of mouse click on DoubleClick event
(尤其是穆斯的回答)