Як зникнути зображення при зіткненні?

У мене є два зображення, які рухаються у горизонтальному напрямку. Кожного разу, коли виникає зіткнення між двома зображеннями, я хочу, щоб вони зникли, і це моя проблема. Чи може хто-небудь допомогти мені, як це зробити?

До речі, це мій код. Ви можете перевірити це, якщо хочете:

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;
}
1
"Я хочу, щоб вони зникли" Припиніть робити все, що ви робите, щоб вони з'явилися. Щоб краще допомогти, опублікуйте SSCCE .
додано Автор Andrew Thompson, джерело
За словами "хочу, щоб вони зникли", ви маєте на увазі, що він повинен бути прихованим миттєво, або зникати, або зникати, коли виникає дим, або взагалі ніколи не з'являється під час зіткнення? Важко відповісти, коли треба вгадати, що таке питання.
додано Автор Stein G. Strindhaug, джерело
@Stein я маю на увазі, що воно ніколи не з'явиться, коли зіткнення станеться.
додано Автор user843916, джерело

2 Відповіді

Оскільки ви два рази повторюєте одну колекцію, я впевнений, що вам потрібно вирішити це, створивши список елементів для видалення, а потім видалити їх після того, як виявлено всі зіткнення.

Подібно до цього:

private boolean checkCollisions()
{
    ArrayList toRemove = new ArrayList();

    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 два рази. Ви можете запобігти цьому і зробити свій цикл більш ефективним, змінивши його для таких циклів (якщо 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);
       //...
    }
}

На відміну, ви впевнені, що ваше повернення цінності повертає те, що ви думаєте? Наразі він поверне помилку, якщо не зіштовхнеться два останніх спрайта в списку. Якщо ви хочете повернути істину, якщо є якісь зіткнення, звільнися від рядка collision = false; Може бути корисніше повернути підрахунок кількості зіткнень, але я залишу це вам ...

0
додано
Чому це повинно мати якусь різницю? Не знаючи, як ви створюєте/оновлюєте список z_sorted_sprites , неможливо вам допомогти ...
додано Автор vaughandroid, джерело
але моє два зображення йде з іншого класу, класу собак і класу Cat.
додано Автор user843916, джерело

Спробуйте наступне:

У своєму методі 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();
            }
0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників