Java 点击一个对象并输出一条消息

标签 java

我目前正在利用业余时间制作一款游戏来提高我的 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

如果这有帮助。

最佳答案

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

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++ ) {

检查每个 block ,并避免在必须检查每个 block 时出现如此大的矩阵。

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

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

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

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

等等。

关于Java 点击一个对象并输出一条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17226036/

相关文章:

java - QueryDsl:使用 or() 和 not() 为条件生成错误的 sql

java - 错误原因 java.lang.IndexOutOfBoundsException : Index: 0, Size: 0

java - Spring mvc注解配置。升级spring 4.3.9报错404

java - 为什么这个简单的 JSON 编码示例在 Apache Camel 中不起作用?

java - 当我从其他类调用该方法时,我的应用程序崩溃

java - 不带引号的 Jackson 字段值

java - 如何在 java 中查询 DBF 文件

java - 如果 Java 中每个对象的行为不同,则实现类的最佳实践

java - 使用 Apache POI 创建 excel 图表

java - 在 Fragments 中使用异步任务时如何避免应用程序崩溃?