Java:检查矩形是否与多个对象发生碰撞

4

我一直通过尝试制作一个球跳跃的小游戏来学习Java。我已经有了三个类(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;
}

如果我继续添加更多的楼层或平台,那么“if”条件将很快脱离控制而变得非常冗长。是否有一种方法可以创建一个方法来循环遍历在我的JumpingBall3类中创建的所有可见的Floor对象?
我已经在这里发布了完整代码,将它放在这篇文章中似乎有点冗长。
3个回答

3

最简单的方法是将所有要检查的对象保存在一个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);
}

有趣,谢谢!我会阅读一些关于集合和列表的内容,因为它们听起来正是我想要实现的,而且符合我的当前知识水平。另外感谢你提供的小例子,这真的有助于说明你所解释的内容。我也会研究一下Stream API。 - Jonathan

2
一种可行的解决方案是让你的“游戏世界”包含一个实体列表(其中实体可以是球、墙或任何其他游戏对象),并拥有一些机制来检测哪些实体靠近其他实体。这将调用某种类型的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);
    }
}

感谢您的回答!这绝对是我将来会参考的东西。虽然它似乎对我来说现在有点高级,但实体、常见行为和多种处理碰撞行为的方法的概念似乎是我在继续开发这个项目的复杂性时会遇到的东西。 :) - Jonathan
@Jonathan 没问题。制作像游戏一样的应用程序是一件很困难的事情,因为涉及到很多状态、时间和空间问题。最好的方法是为每个东西制作小而完全理解的构建块,并慢慢地将它们放在一起。 - NESPowerGlove

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接