我正在创建一个战舰游戏,每轮玩家都可以通过用鼠标选择距离他最近的 4 个方 block 来选择 4 条航线。
现在,在下面的 gif 中,您可以看到我是否将鼠标悬停在图 block 的最边缘,它会一次选择两个图 block ,如果您将鼠标放在 4 个图 block 的中间,甚至一次选择 4 个图 block :
(来源:gyazo.com)
这不应该在游戏中真正发生,我该如何防止这种情况发生?
这是更新代码:
/**
*
* @param x mouse X
* @param y mouse Y
*/
public void checkHover(int x, int y) {
for (int i = 0; i < tiles[0].length; i++) {
for (int j = 0; j < tiles[1].length; j++) {
// get coordinates from tile
int x1 = i * (sprite.getWidth() - 1);
int y1 = j * (sprite.getHeight() - 1);
// If we have screen translate, we can cancel it for
// this situation
int realX = x - this.translate.getX();
int realY = y - this.translate.getY();
// checking if mouse inside tile
if (realX >= x1 && realX <= x1 + sprite.getWidth() &&
realY >= y1 && realY <= y1 + sprite.getHeight()) {
// set tile to hovered sprite
this.tiles[i][j].setHover(true);
}
else {
// cancel hovered sprite
this.tiles[i][j].setHover(false);
}
}
}
}
如何防止这种情况发生?
最佳答案
我将根据鼠标的 x 和 y 位置计算 2d 数组的索引,而不是两个循环,方法是将 x 和 y 位置除以从一个图 block 到下一个图 block 的空间大小(看起来是图 block 宽度加 1,即空边框)。这将导致边框悬停偏向某一侧,但看起来您无论如何都不想选择两个图 block 。
获得图 block 的索引后,打开突出显示,并使用 lastHighlightedTile
等实例变量保留对其的引用,但在此之前,还要调用 lastHighlightedTile.setHover(false);
。
如果图 block 的索引无效,就像鼠标超出了图 block 区域一样,请不要访问该数组,仍然调用 lastHighlightedTile.setHover(false);
。
这应该可以修复突出显示多个图 block 的问题,并且还允许您关闭之前的突出显示(打破当前循环的解决方案可能不会关闭之前的突出显示)。
关于java - 鼠标悬停时图 block 会更改颜色 - 防止一次选择多个图 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24541052/