突破碰撞检测

时间:2015-01-28 14:33:41

标签: java swing awt collision java-2d

我尝试使用简单的Break Out克隆来了解游戏状态,游戏循环等。

我遇到困难的一件事是碰撞检测。

我有一个GameItem类,由Ball,Brick和Paddle扩展。在这个类中,我有一个getBounds()方法来返回对象的边界Rectangle,一个碰撞(GameItem item)方法来确定2 GameItem个对象是否已经碰撞,以及{ {1}},hitTop()hitBottom()hitLeft()确定对象与另一方相撞的一面。

这些方法如下:

hitRight()

球类有一个名为public Rectangle getBounds() { return new Rectangle(x, y, width, height); } public boolean collision(GameItem item) { return getBounds().intersects(item.getBounds()); } public boolean hitTop(GameItem item) { return getY()+getHeight()>=item.getY(); } public boolean hitLeft(GameItem item) { return getX()+getWidth()>=item.getX(); } public boolean hitBottom(GameItem item) { return getY()<=item.getY()+item.getHeight(); } public boolean hitRight(GameItem item) { return getX()<=item.getX()+item.getWidth(); } 的方法来确定球何时击中另一个物体。具体如下:

checkBallCollissions(GameItem item)

其名称如下:

public boolean checkBallCollisions(GameItem item)
{
    if(this.collision(item))
    {
        if(this.hitTop(item))
        {
            this.setVY(-1*this.getVY());
            return true;
        }
        else if(this.hitBottom(item))
        {
            this.setVY(-1*this.getVY());
            return true;
        }
        else if(this.hitLeft(item))
        {
            this.setVX(-1*this.getVX());
            return true;
        }
        else if(this.hitRight(item))
        {
            this.setVX(-1*this.getVX());
            return true;
        }
        return false;
    }
    return false;
}

如您所见,如果它碰到4个边中的一个,则x / y方向会相应地反转。

然而,这不起作用。分析代码似乎是一个明显的问题,我无法通过解决方案来解决问题。

下面的3张图片显示了球与上方,下方和右方的物体碰撞。

enter image description here enter image description here enter image description here

使用代码,它首先根据边界矩形和intersects()方法检测碰撞。然后它确定它击中了哪一侧。如果它从上面击中就有效。然而,当它从底部或右边撞击时,ball.checkBallCollisions(paddle); 将返回true,因为hitTop()对于这两种情况都是正确的(即球的底部边缘具有比顶部边缘更大的y值。反对它与之碰撞。

我缺少什么条件来解决这个问题,并且有完美的碰撞检测?

2 个答案:

答案 0 :(得分:0)

对于圆圈,您使用圆的半径而不是边界,因为边界是一个矩形。 我相信有一些方法可以在java中完成,但我还不知道它们,所以应该做一些研究。

另外,对于高级碰撞,人们倾向于使用矢量,我再也没有摆弄它们,所以你也必须研究它。

这是让你前进的事情:

Java area and intersection

答案 1 :(得分:0)

这里的问题是你提到的 &#34; hitTop()将返回true,因为getY()+getHeight()>=item.getY()对于这两种情况都是正确的(即,球的下边缘具有比其碰撞的对象的上边缘更大的y值。用)&#34。

为了解决这个问题,你还需要检查以确保圆圈的y位置小于游戏对象的y位置+游戏对象的高度(也可能减去它的一些偏移量)。

哪个应该是这样的(不要担心偏移):

public boolean hitTop(GameItem item)
{       
    return getY() + getHeight() >= item.getY() && 
        getY() < item.getY() + item.getHeight();     
}

您需要为所有碰撞执行此操作。