2011-04-09 76 views
1

我创建了一个游戏,pacman专门作为我的课程作业的一部分,当碰到使用矩形的碰撞检测时我遇到了问题。Java:帮助确定两个矩形之间的碰撞

我遇到的问题是即使在屏幕上看到字符不会碰撞检查交叉口实际上总是返回true。下面的输出解释了我的意思是:

吃豆子细节:X 17.0Ÿ16.0 漆黑的细节:X 22.0Ÿ调用相交()后13.0 碰撞:真 吃豆子细节:X 18.0Ÿ16.0 漆黑的详细信息: X 23.0Ÿ调用相交()后13.0 碰撞:真

我已经矩形设置如下:

public Rectangle pacmanBounds(){ 
    return new Rectangle(pacRow, pacColumn, 22, 22); 
} 
public Rectangle ghostBounds(){ 
    return new Rectangle(ghostRow, ghostColumn, 22, 22); 
} 

高度和宽度已经过硬编码用于测试目的,但这些是实际的图像大小。

我检查碰撞如下每次JPanel的重新绘制:在时间

public boolean checkCollision(){ 
    Rectangle pacmanBounds = pacman.pacmanBounds(); 
    //currently commented out for testing 
    /*if(pacmanBounds.intersects(inky.ghostBounds()) || pacmanBounds.intersects(blinky.ghostBounds()) 
      || pacmanBounds.intersects(pinky.ghostBounds()) || pacmanBounds.intersects(clyde.ghostBounds())){ 
     System.out.println("Oh no!"); 
     return true; 
    }*/ 

    System.out.println("Pacman details: x " + pacmanBounds.getX() + " y " + pacmanBounds.getY() + " "); 
    System.out.println("Inky details: x " + inky.ghostBounds().getX() + " y " + inky.ghostBounds().getY()); 
    System.out.println("Collision after calling intersects(): " + pacmanBounds.intersects(inky.ghostBounds())); 
    return false; 
} 

在这一点上我已经差不多用完了关于如何解决这个问题,所以任何意见,你们的想法可以给予不胜感激!

+2

很明显看到这两个矩形相交:{(17,16),(39,38)}和{(22,13),(44,35)}。我想问题是为什么图像看起来不像它相交?它有一个很大的透明边框吗? – rlibby 2011-04-09 01:40:21

+0

谢谢你的评论rlibby,你说的对十字路口我想我完全忘了矩形是如何工作的!我已经缩小了矩形的大小,它正在工作:) – tfstorm 2011-04-09 02:06:02

回答

1

假设getX()getY()返回的点左上矩形的坐标,则这些将是矩形的每个呼叫的界限:

豆子细节:X 17.0ý16.0漆黑细节: X 22.0Ÿ调用相交()后13.0碰撞:真

吃豆子矩形将其左上角的坐标加上在每个方向22,让您与右下角(39.0, 38.0),其中大部分肯定有相交的矩形漆黑的,如果他的鞋面右角是(22.0, 13.0),左下角是(44.0, 35.0)

这就是它对我来说的样子。你的意思是22.0是像素还是正方形的Pacman和Inky矩形的边界?如果这些假设是正确的,那么Inky的左下角(22.0, 35.0)完全位于Pacman内部,这可能不是你想要的。这个问题可能是很多事情,如果不知道看到更多的代码并且知道矩形的含义,很难说出它会是什么。 :D

+0

感谢您的评论是的,你是对的我想我迷失在我自己的代码(并忘记了矩形的工作方式)!添加22的方式太大了,我现在已经缩小了它的尺寸,并且工作完美,或者在早上凌晨3点尽可能接近! :) – tfstorm 2011-04-09 02:04:40

+0

@tfstorm很高兴帮助!欢迎来到Stackoverflow! :) – 2011-04-09 02:12:51