发生碰撞时如何消失图像?

时间:2011-10-28 04:10:20

标签: java image collision-detection

我有两个水平方向移动的图像。每当两个图像之间发生碰撞时,我希望它们消失,这就是我的问题。有人可以帮我怎么做吗?

顺便说一句,这是我的代码。如果您愿意,可以查看:

private boolean checkCollisions()
{
    for (Sprite r1 : z_sorted_sprites)
    {
        for (Sprite r2 : z_sorted_sprites)
        {
            if (r1 == r2)
            {
                continue;
            }

            RectangleX me = r1.getBounds();
            RectangleX other = r2.getBounds();

            if (me.intersects(other))
            {
                collision = true;

                System.out.println("collision : " + r1.getName() + " with " + r2.getName());

                // disappear(me,other);
            }
            else
            {
                collision = false;
                System.out.println("no collision");
            }
        }

    }
    return collision;
}

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

paint(Graphics g)方法中,执行以下操作:

if(!checkCollisions()){
   //draw your sprites
   //g.drawImage(...);
}

在checkCollisions()方法中,在检测到碰撞时调用重绘。

if (me.intersects(other))
            {
                collision = true;

                System.out.println("collision : " + r1.getName() + " with " + r2.getName());

                repaint();
            }

答案 1 :(得分:0)

因为你在同一个集合上迭代两次,所以我很确定你必须通过构建要删除的项目列表来解决它,然后在检测到所有冲突后删除它们。

像这样:

private boolean checkCollisions()
{
    ArrayList<Sprite> toRemove = new ArrayList<Sprite>();

    for (Sprite r1 : z_sorted_sprites)
    {
        for (Sprite r2 : z_sorted_sprites)
        {
            // ...
            if (me.intersects(other))
            {
                // ...
                toRemove.add(r1);
                toRemove.add(r2);
            }
            else
            {
                // ...
            }
        }
    }

    z_sorted_sprites.removeAll(toRemove);

    return collision;
}

请注意,当两个精灵碰撞时,它们每次都会被添加到toRemove列表中两次。您可以通过更改for循环来阻止此操作并提高循环效率(假设z_sorted_spritesList):

for (int i = 0; i < z_sorted_sprites.size(); i++)
{
    Sprite r1 = z_sorted_sprites.get(i);
    for (int j = i + 1; j < z_sorted_sprites.size(); j++)
    {
        Sprite r2 = z_sorted_sprites.get(j);
        // ...
    }
}

顺便说一句,你确定你的回报价值正在回归你的想象吗?目前它将返回false,除非列表中的最后两个精灵碰巧碰撞。如果你想让它在有任何碰撞的情况下返回true,那么摆脱一行collision = false;返回一个碰撞次数可能会更有用,但我把它留给你......