我正在创建一个战舰游戏,玩家可以通过用鼠标选择4个最接近的牌来选择4个船只路线。
现在在下面的gif中,你可以看到我是否会悬停在瓷砖的最边缘,如果你将鼠标放在4个瓷砖的中间,它会一次选择两个瓷砖,或者一次选择4个瓷砖:
gif http://gyazo.com/4d9f4a07b19d01642f92d3818f36b5fa.gif
这不应该在游戏中真正发生,我该如何防止呢?
这是更新代码:
/**
*
* @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);
}
}
}
}
我该如何防止这种情况?
答案 0 :(得分:1)
我将根据鼠标的x和y位置计算2d数组的索引,而不是两个循环,将x和y位置除以从一个tile到下一个tile的空间(看起来是瓷砖宽度加1,空边框)。这将导致边界悬停有利于某一方,但看起来你不想选择两个方块。
获得磁贴的索引后,切换突出显示,并使用lastHighlightedTile
等实例变量保留对它的引用,但在此之前,也请调用lastHighlightedTile.setHover(false);
。
如果磁贴的索引无效,就好像鼠标位于磁贴区域之外,请不要访问该阵列,仍然可以调用lastHighlightedTile.setHover(false);
。
这应修复突出显示多个图块,并且还允许您关闭上一个突出显示(突破当前循环的解决方案可能不会关闭之前的突出显示)。
答案 1 :(得分:0)
编辑:不同的解决方案: 只需在方法的开头声明一个布尔值,并仅在该布尔值仍然为false时设置。一旦设置了tile,也将boolean设置为true,这将阻止其他人被设置。
public void checkHover(int x, int y) {
boolean hasTurnedOneOn = false;
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() && !hasTurnedOneOn) {
// set tile to hovered sprite
this.tiles[i][j].setHover(true);
hasTurnedOneOn = true;
}
else {
// cancel hovered sprite
this.tiles[i][j].setHover(false);
}
}
}
}
答案 2 :(得分:0)
假设精灵的宽度等于50,我看到第一个标题有x1到x2坐标(0 - 50),第二个标题有(49 - 100),第三个标题有(99 - 150)......相同的y尺寸。
因此,当指针位于(x)=(50)时,它会悬停(x1 - x2)(0-50)和(49-100)个标题。
为什么从精灵宽度/高度中减去1? 试试这个:
// get coordinates from tile
int x1 = i * (sprite.getWidth());
int y1 = j * (sprite.getHeight());
编辑:我写了一个示例应用程序,它推动了我的解决方案:
public class App {
Tile[][] tiles;
Sprite sprite;
public static void main(String[] args) {
App app = new App();
app.init();
app.checkHover(50, 50);
app.printHovers();
}
private void init() {
sprite = new Sprite();
tiles = new Tile[10][10];
for (int i = 0; i < tiles[0].length; i++) {
for (int j = 0; j < tiles[1].length; j++) {
tiles[i][j] = new Tile();
}
}
}
public void checkHover(int x, int y) {
for (int i = 0; i < tiles[0].length; i++) {
for (int j = 0; j < tiles[i].length; j++) {
// get coordinates from tile
int x1 = i * (sprite.getWidth());
int y1 = j * (sprite.getHeight());
// If we have screen translate, we can cancel it for
// this situation
// int realX = x - this.translate.getX();
// int realY = y - this.translate.getY();
int realX = x;
int realY = y;
// 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);
}
}
}
}
public void printHovers() {
for (int i = 0; i < tiles[0].length; i++) {
for (int j = 0; j < tiles[i].length; j++) {
System.out.print((tiles[i][j].isHover() ? "Y" : "O") + " ");
}
System.out.println();
}
}
public class Sprite {
public int getWidth() {
return 50;
}
public int getHeight() {
return 50;
}
}
public class Tile {
private boolean hover;
public boolean isHover() {
return hover;
}
public void setHover(boolean hover) {
this.hover = hover;
}
}
}
适用于(49,49),(49,50),(50,49)和(50,50)个坐标。
因此,首先必须删除-1减法,然后将<=
测试更改为<
。