鼠标悬停时平铺更改颜色 - 防止一次选择多个图块

时间:2014-07-02 21:07:20

标签: java graphics

我正在创建一个战舰游戏,玩家可以通过用鼠标选择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);
            }
        }
    }
}

我该如何防止这种情况?

3 个答案:

答案 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减法,然后将<=测试更改为<