从MouseListener查找图块

时间:2019-05-21 11:37:03

标签: java

我正在尝试使用MouseListener interface进行国际象棋游戏。 (没有JButtons!) 单击后,我可以在[x, y]上找到单击的JFrame位置,但是我想找到磁贴。

棋盘是一个8 x 8网格。瓦片是该网格上的位置(因此[1, 3]是瓦片。)

我的想法是将xPosition除以tileWidth,将yPosition除以tileHeight。我应该能够通过获取屏幕的大小并将其除以瓦片的数量来找到tileHeighttileWidth(这将始终为8,因为国际象棋棋盘是{ {1}})

这在大多数情况下都有效,但是当我单击更靠近每个图块的边缘时,上面的方程式的结果不准确。

8 x 8

编辑:我的/** * @param screen The JPanel that contains the tiles (Will always be the size of the entire board) * @param pos The (x, y) position of the click * @return The tile found from the click */ public Tile getTile(Screen screen, Pos pos) { int x = (pos.x / (screen.getWidth() / Board.WIDTH)); // When trying to typecast to a double, then back to an int, the result become more inaccurate. int y = (pos.y / (screen.getHeight() / Board.HEIGHT)); System.out.println(new Pos(x, y)); return tiles[y][x]; } JPanel的大小相同(JFrame中的区域)

2 个答案:

答案 0 :(得分:3)

编辑:我完全错了!

假设整个JPanel填充了整个JFrame,并且参数pos在JPanel和JFrame的左上角开始一个[0,0]并以其最大值结尾右下角的尺寸,您的计算实际上是正确的:

假设您的JPanel和JFrame的宽度为1000px,高度为1000px。

让我们水平(左右)单击500像素,这意味着水平轴(X)的右侧

      Click
        |
        +
|1|2|3|4|5|6|7|8|

计算结果为:500/(1000/8) = 500/(125) = 4, 当我们说完全在第4列和第5列之间单击是对第4列的单击时,这是正确的。 tiles[y][4-1]; 记住数组从0开始

在执行(499/(1000/8) = 499/(125) = 3,992时,将其转换为整数将是3 (广播删除所有十进制数字)

执行(501/(1000/8) = 501/(125) = 4,008时,将其强制转换为int也是4。这也是正确的。

当在屏幕的左侧50%(499px)时,您希望具有[tile] [y] [3],在屏幕的右侧50%时,您想要具有tile [y] [4]

这意味着您的计算是正确的。

我唯一能想到的是鼠标位置错误,或者JFrame无法完全填充JPanel。

尝试在鼠标移动时打印出鼠标位置,然后检查是否正确

答案 1 :(得分:0)

问题部分与方程有关。我应该坚持下面所示的类型转换:

int x = (int) (pos.x / ((double) screen.getWidth() / Board.WIDTH));
int y = (int) (pos.y / ((double) screen.getHeight() / Board.HEIGHT));

但是真正的问题是MouseEvent interface JFRAME 的左上角算作point[0, 0]。这意味着 JCONTENTPANE 的左上角实际上是point[~10, ~40](我说这是因为该点可能因计算机而异,并且我个人能够单击多近JFrame)。如果您希望找到多余空间的确切值,请获取JFrame的大小并减去JContentPane的大小。

int x = (int) ((pos.x - X_OFFSET) / ((double) screen.getWidth()  / Board.WIDTH));
int y = (int) ((pos.y - Y_OFFSET) / ((double) screen.getHeight() / Board.HEIGHT));

X_OFFSET = 8Y_OFFSET = 38