我正在尝试使用MouseListener
interface
进行国际象棋游戏。 (没有JButtons!)
单击后,我可以在[x, y]
上找到单击的JFrame
位置,但是我想找到磁贴。
棋盘是一个8 x 8
网格。瓦片是该网格上的位置(因此[1, 3]
是瓦片。)
我的想法是将xPosition
除以tileWidth
,将yPosition
除以tileHeight
。我应该能够通过获取屏幕的大小并将其除以瓦片的数量来找到tileHeight
和tileWidth
(这将始终为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中的区域)
答案 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 = 8
和Y_OFFSET = 38