0

我目前在业余时间制作一个游戏来改进我的 Java,但我在做我想做的事情之一时遇到了麻烦。我做了这个游戏,所以我可以把一个项目放到某个位置。在此示例中,它是某个位置的塔。当这个塔被放置在这个位置并且我点击塔时,我希望它输出一条消息。但是我尝试了很多方法来做到这一点,我还没有找到解决方案。我为此提供的代码是:

public static void click(int X, int Y){
    System.out.println("X. " + X + " Y. " + Y);

    if(Screen.room.block[X][Y].airID == Value.tower){
        System.out.println("Tower clicked");
    }
}   

当塔被放置在一个位置时,我使用的代码是:

        if(holdsItem){
                for(int y=0; y<Screen.room.block.length; y++){
                    for(int x=0; x<Screen.room.block[0].length; x++){
                        if(Screen.room.block[y][x].contains(Screen.mse)){
                            if(Screen.room.block[y][x].groundID != Value.ground && Screen.room.block[y][x].airID == Value.tower){
                                Screen.room.block[y][x].airID = heldID;


                        }
                    }
                }
            }
        }

当我通过以下方式放下塔时:

System.out.println(Screen.room.block[y][x]);

我明白了

Block[x=243,y=260,width=52,height=52]

这工作正常,塔已放置。然后我想使用放置塔的位置,然后如果按下该位置,则消息将打印在控制台中。然而这并没有发生。谁能帮我解决这个问题。

我使用鼠标侦听器,它是:

    public void mouseClicked(MouseEvent e) {
        e.getX();
        e.getY();
        Block.click(e.getX(), e.getY());

    }

当我点击一个位置时,我得到:

System.out.println("X. " + X + " Y. " + Y);

X. 257 Y. 298

如果这有帮助。

4

2 回答 2

2

现在您正在使用像素来获取对象的位置,因此您需要检查的不仅仅是每个块的确切“原点”像素。

public static void click(int X, int Y){
    System.out.println("X. " + X + " Y. " + Y);

    //Look for every block in the matrix
    for ( int i = 0; i<Screen.room.block.length; i++ ) {
      for ( int j = 0; j<Screen.room.block[0].length; j++ ) {
         if(Screen.room.block[i][j].airID == Value.tower){
            //Check if we hit within the block's bounds
            if ( X >= i && X <= i+blockWidth &&
                 Y >= j && Y <= j+blockHeight  )
             System.out.println("Tower clicked");
             return;
         }
      }
    }
}   

一种常见的做法是将对象存储在某种列表或一维数组中,这样您就可以避免

     for ( int i = 0; i<Screen.room.block.length; i++ ) {
      for ( int j = 0; j<Screen.room.block[0].length; j++ ) {

然后做

     for ( int i = 0; i<Screen.room.blocks.length; i++ ) {

检查每个块并避免在无论如何都必须检查每个块时拥有如此大的矩阵。

另一种方法:您可以在类似跳棋的矩阵中给每个块一个位置,然后将鼠标单击的事件坐标从像素转换为“块”坐标:

public void mouseClicked(MouseEvent e) {
    int x = e.getX() / widthOfABlockInPixels;
    int y = e.getY() / heightOfABlockInPixels;
    Block.click(x, y);
}

假设您的对象是 100x100 像素,那么这将为您提供正确的块坐标

(160, 150) => (1, 1)
(60, 50) => (0, 0)

等等。

于 2013-06-21T01:16:19.017 回答
0

这听起来可能有点过于简单,但是,再说一遍,我只是在这里吐口水。您是否考虑过将消息实现到 JOptionPane.showMessageDialog 中?不知道这是否是你要找的。

于 2013-06-21T00:46:49.190 回答