0

我想要做的是在我的棋盘游戏图片上找到一个人点击的位置,并根据它在我的二维数组中更改值。它有点像井字游戏,但更大,你把石头放在十字路口。到目前为止,我能够获得鼠标的 x 和 y 位置,并检查用户是否单击了左上角的第一个交叉点并且有效,但我正在考虑编写某种 for 循环来检查所有交叉点。

这是我检查顶部交叉点的代码

if ((x >= 278 && x <= 285) && ( y >= 160 && y <= 175))
    {
        System.out.println("intersection 1 clicked");
    }

所以我的问题是我将如何编写我的 for 循环来检查所有的交叉点?如果您不想编写代码,即使逻辑也很好。

提前感谢任何帮助。

http://i.stack.imgur.com/yzPTA.png这是我的程序运行左上角石头是我的光标

http://i.stack.imgur.com/l6UrW.png这是我的代码

4

2 回答 2

2

如此处所示,您可以根据所需的网格坐标计算屏幕坐标。单击并拖动以捕获SIZE屏幕的一个正方形,然后将鼠标悬停在其上以查看其mouseMoved()工作原理。在此使用了类似的方法MapPanel

图片

于 2013-06-01T18:33:34.673 回答
1

我认为 for 循环会使事情变得过于复杂。您可以改为编写一些语句来在 和 之间进行screen space转换board space

假设您的屏幕空间是800pxby600px并且您有一个10 x 10由二维数组表示的游戏板:board[10][10]。还假设您开始在10px偏移处绘制板0,0并且您的板很500px宽。在这种情况下,您知道板上每个单元格占用多少屏幕空间:

int boardScreenWidth = 500;
int cellWidth = boardScreenWidth / boardWidth;
           // = 500px / 10 
           // = 50px

首先忽略不接触板的点击:

int boardStartX = 10; 
if (mouseX < boardStartX || mouseX >= boardStartX + boardScreenWidth)
  return; // The user clicked somewhere to the left or right of the board

然后,如果点击是在棋盘上,您将需要根据棋盘与 0 的偏移量来调整鼠标位置(这样点击x=10px就如同在x=0棋盘位置上单击一样)。有了这些信息,就可以很容易地将屏幕空间中的 x 坐标转换为 中的索引board

int mouseX = 320; // user clicked at x=320
mouseX = mouseX - boardStartX; // adjust based on board's position
int boardX = mouseX / cellWidth;
        // = 310 / 50
        // = 6

您可以找到boardY类似的方法,然后访问在 处单击的单元格board[boardX][boardY]

编辑:要从索引中获取屏幕坐标,请board使用上面相同的逻辑,但要解决mouseX

int boardX = (mouseX - boardStartX) / cellWidth;
// ==> boardX * cellWidth = mouseX - boardStartX
// ==> (boardX * cellWidth) + boardStartX = mouseX
// or...
int screenX = boardStartX + (boardX * cellWidth);

请注意,这是单元格的边缘。整个单元格将从screenXscreenX + cellWidth。单元格的中心位于screenX + cellWidth / 2

于 2013-06-01T18:33:24.993 回答