Java:检查多个对象的矩形碰撞

时间:2016-09-30 17:36:16

标签: java collision-detection collision

我通过尝试一些小游戏来学习Java#34;这开始只是试图让球跳。我有3个班级(JumpingBall3,BallSprite3,& Floor),并且已经达到了一些重力,跳跃能够始终如一地运行,并且能够对地板进行探测以阻止球无限下降。最后一点,我发现了未来发展的潜在问题。现在我有两个楼层由JumpingBall3创建(" floor1"&" platform")我使用以下代码检测BallSpite3内的碰撞:

public boolean collision() 
{

    if (game.floor1.getBounds().intersects(getBounds()) || game.platform.getBounds().intersects(getBounds()))        {
        onFloor = true;
    }
    else 
    {
        onFloor = false;
    }

    return onFloor;
}

如果我要继续添加更多的楼层或平台,那么"如果"在长度方面,状况很快就会失控。有没有办法创建一个循环遍历我的JumpingBall3类中创建的所有可见Floor对象的方法?

我已经在网上发布了完整的代码here,这篇帖子中包含的内容似乎有点冗长。

3 个答案:

答案 0 :(得分:2)

最简单的做法是将所有要检查的对象保留在Collection中,例如List,然后迭代此List

因此,例如,一个很好的选择是使用Floor的集合,我们在其上迭代检查我们是否与其中一个发生冲突。

public boolean collision() {
    boolean onFloor = false;
    Rectangle rectangle = getBounds();
    for (Floor floor : floors) {
        if (floor.getBounds().intersects(rectangle)) {
            onFloor = true;
            break;
        }
    }
    return onFloor;
}

假设您使用 Java 8 ,您可以依靠Stream API执行与下一步相同的操作:

public boolean collision() {
    Rectangle rectangle = getBounds();
    return floors.stream().map(Floor::getBounds).anyMatch(rectangle::intersects);
}

答案 1 :(得分:1)

创建包含所有对象的列表。然后在你要检测的所有对象上使用一个循环(除了那个进行检测的对象)

答案 2 :(得分:1)

这个问题的一个平易近人的解决方案是让你的“游戏世界”包含一个实体列表(一个实体可以是一个球或一个墙或任何其他游戏对象),并有一些机制可以检测哪些实体在附近其他实体。这最终会调用某种类型的entity.checkCollision(neighborEntity)方法。

您仍然需要有不同的行为来与不同的实体发生冲突。您可以通过让基础Entity类具有一些可以关闭或打开的常用属性来实现此目的,或者存储可以直接应用于冲突实体的行为。

// within some game loop, check for collisions
for (Entity entity : collidableEntities)
{
    ball.checkCollision(entity);
}

您的课程可能看起来像编程行为。

public Entity
{
    public void applyCollisionBehaviorTo(Ball ball) { // Override to do something}

    public void onCollision() { // Override to do something }

    public collidesWith(Entity neighbor) { // your collision math }

    public void checkCollision(Entity neighbor)
    {
        if (collidesWith(neighbor))
        {
            onCollision()
        }
    }
}

public Wall extends Entity
{
    @Overide
    public void applyCollisionBehaviorTo(Ball ball)
    {
        ball.reverseDirection();
    }
}

public Ball extends Entity
{
    @Overide
    public void onCollision(Entity collidingEntity)
    {
        collidingEntity.applyCollisionBehaviorTo(this);
    }
}
相关问题