Как исчезнуть изображение при столкновении? - PullRequest
1 голос
/ 28 октября 2011

У меня есть два изображения, которые движутся в горизонтальном направлении. Всякий раз, когда происходит столкновение между двумя изображениями, я хочу, чтобы они исчезли, и это моя проблема. Может ли кто-нибудь помочь мне, как это сделать?

Кстати, это мой код. Вы можете проверить это, если хотите:

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 голосов
/ 28 октября 2011

Поскольку вы перебираете одну и ту же коллекцию дважды, я почти уверен, что вы должны решить ее, создав список удаляемых элементов, а затем удаляя их после обнаружения всех коллизий.

Вроде так:

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_sprites является List):

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; Возможно, было бы более полезно вернуть счетчик количества коллизий, но я оставлю это вам ...

0 голосов
/ 28 октября 2011

Попробуйте следующее:

В вашем paint(Graphics g) методе выполните следующее:

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

А в вашем методе checkCollisions () вызывайте repaint при обнаружении столкновения.

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

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

                repaint();
            }
...