当前位置: 首页 > 知识库问答 >
问题:

爆发碰撞检测

郁隐水
2023-03-14

我正在用一个简单的克隆人进行实验,以了解游戏状态,游戏循环等。

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

我有一个由Ball、Brick和Paddle扩展的GameItem类。在这个类中,我有一个getBound()方法来返回对象的边界矩形,一个碰撞(GameItemitem)方法来确定2个GameItem对象是否发生了碰撞,以及用于hitTop()hitBottom()hitNorth()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();
}

ball类有一个名为< code > checkBallCollissions(game item 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;
}

其名称如下:

ball.checkBallCollisions(paddle);

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

然而,这是行不通的。分析代码,似乎有一个明显的问题,我无法找到解决方案。

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

使用代码,它首先根据边界矩形和相交()方法检测冲突。然后,它确定它击中了哪一侧。如果它从上面击中,它的工作原理。但是,当它从底部或右侧命中时,则 hitTop() 将返回 true,因为 getY() 得到Height()

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


共有2个答案

汝和裕
2023-03-14

这里的问题是,正如您提到的“hitTop()将返回true,因为getY()getHeight()

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

应该是这样的(不用担心偏移量):

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

您需要对所有冲突执行此操作。

常波
2023-03-14

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

此外,对于高级碰撞,人们倾向于使用向量,同样,我以前从未摆弄过它们,所以你也必须研究它。

这里有一些东西可以让你走:

爪哇区域和交叉点

 类似资料:
  • 碰撞检测 现在你知道了如何制造种类繁多的图形对象,但是你能用他们做什么?一个有趣的事情是利用它制作一个简单的 碰撞检测系统 。你可以用一个叫做:hitTestRectangle 的自定义的函数来检测两个矩形精灵是否接触。 hitTestRectangle(spriteOne, spriteTwo) 如果它们重叠, hitTestRectangle 会返回 true。你可以用 hitTestRect

  • 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 当试图判断两个物体之间是否有碰撞发生时,我们通常不使用物体本身的数据,因为这些物体常常会很复杂,这将导致碰撞检测变得很复杂。正因这一点,使用重叠在物体上的更简单的外形(通常有较简单明确的数学定义)来进行碰撞检测成为常用的方法。我们基于这些简单的外形来检测碰撞,这样代码会变得

  • 我正在尝试做一个平台游戏,其中没有斜坡。我正在尝试将碰撞检测降下来,但是我在pygame中找不到一种方法来获得哪一边与另一个Sprite发生了碰撞。有没有人能给我一个好的方法来做到这一点,那不是太庞大,但也能很好地工作在我的情况? 下面是我的玩家类: 我已经将它添加到我的player类中,每次播放器更新时我都运行它,并且它工作...差一点。 在平台顶部的碰撞起作用,在侧面的碰撞几乎总是起作用,除非

  • 问题内容: 有人可以帮我了解JS中冲突检测的工作原理吗?我不能使用jQuery或gameQuery-已经使用了原型- 因此,我正在寻找非常简单的东西。不要求完整的解决方案,只需为我指明正确的方向。 假设有: 现在球正在移动(任何方向)。“ Someobject”(0-X)已经预先定义,其中有20-60个随机放置,如下所示: 我可以创建一个位置为“ someobject(X)”的数组,并在“球”移动

  • 我已经尝试添加冲突检测一段时间了,但似乎做不到... 要绘制地图,我只需使用x,y坐标: 使用这种方法,我想出了这种检测: 我一直在尝试使用for循环遍历树来检测玩家(一个矩形)是否穿过树,但我想不出任何东西。 我已经试过了 如果碰撞=true,player.update(碰撞)将矩形更改为红色,如果为false,将矩形变为黑色。 我已尝试使用for和if,例如: 等但这不起作用,它只适用于wit

  • 所以我试图用Python和Pyplay创建一个益智平台游戏,但是我遇到了一点麻烦。当我为主要角色使用单点图像,而不是矩形图像时,如何制作碰撞检测器?我知道直角图像有左、右、顶部和底部像素功能(这对冲突检测非常有用),但是对于单片图像有这样的功能吗?或者我只需要为x和y坐标创建一个变量图像的宽度/高度?我试过用那个 但是catImg一直在通过窗户的尽头。我做错了什么?提前谢谢。