2013-07-29 2 views
-1

У меня очень простая игра, в которой я играю, построенная на примере прикосновения/физики. В основном, что происходит, когда вы касаетесь экрана, он создает форму с телом и отскакивает вокруг с помощью box2d. Теперь то, что я хотел бы сделать, это когда этот конкретный спрайт сталкивается с чем-либо вообще, он изменит текущий кадр на «1» на мгновение, а затем вернется к оригиналу.Обновлен только столкнувшийся спрайт

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

private ContactListener createContactListener() 
    { 
     ContactListener contactListener = new ContactListener() 
     { 

      @Override 
      public void beginContact(Contact contact) { 
       face.animate(new long[] { 50, 10}, new int[] {1, 0}, 0);; 


      } 

      @Override 
      public void endContact(Contact contact) { 

      } 

      @Override 
      public void preSolve(Contact contact, Manifold oldManifold) { 

      } 

      @Override 
      public void postSolve(Contact contact, ContactImpulse impulse) { 

      } 

     }; 
     return contactListener; 
    } 

Как я уже сказал, я думаю, что я близок. Я просто не могу понять, как это понять. Спасибо!

+0

Я не думаю, что у вас есть достаточно информации здесь. Что такое лицо? и как он хранится? Вероятно, у вас есть что-то статическое в классе, которого вы не ожидаете. – HalR

+0

Лицо - спрайт с прикрепленным к нему телом. Когда сцена создается, она создает физический мир, а гравитация следует за акселерометром. Когда вы касаетесь в любом месте экрана, он создает «лицо» и его тело, и они отскакивают. Итак, когда вы касаетесь сцены 5 раз, вы делаете 5 лиц. Я хотел, чтобы каждый, столкнувшись с чем-либо, переключился на другой кадр на короткое время, а затем вернулся к исходному фрейму. – Cyanocobalamin

ответ

0

С помощью контактного слушателя он не будет называться индивидуально для двух сталкивающихся тел. Я имею в виду, что когда BodyA сталкивается с BodyB, вызывается только один обратный вызов слушателя. Вы обновляете только экземпляр класса, к которому зарегистрирован прослушиватель контактов.

Что нужно сделать, так это передать экземпляр класса, к которому принадлежит лицо, как userData при регистрации слушателя (для каждого из них). Тогда вы можете получить экземпляр из контакта с помощью:

FaceClass* fcA = contact.GetFixtureA().GetBody().GetUserData(); 
FaceClass* fcB = contact.GetFixtureB().GetBody().GetUserData(); 

Затем вызовите функцию в извлеченных экземплярах, которые будут делать то, что вам нужно, может быть что-то вроде «updateOnCollision».

fcA.updateOnCollision(); 
fcB.updateOnCollision(); 

P.S. Я написал код с головы, и мой Джейв плохой, поэтому может потребоваться небольшая корректировка.

Смежные вопросы