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