BOX2D - правильные столкновения с Monster - PullRequest
2 голосов
/ 21 января 2012

Я занимаюсь разработкой Android-игры с 2D-прокруткой с использованием AndEngine и ее расширения BOX2D.

У меня есть тело игрока с двумя датчиками для «ног» и «головы», поэтому я могу точно знать, какая сторона игрока касалась другого объекта и т. Д. Вот изображение, показывающее, как это работает:

enter image description here

Это хорошо работает для проверки, касается ли игрок в настоящее время касания земли ногами, поэтому он может прыгать, например, и т. Д. Теперь я пытаюсь реализовать действия, выполняемые после контакта с телом монстра.

В моем контактном датчике я проверяю

                if (x1.getBody().getUserData().equals("monster") && x2.getUserData().equals("foot"))
                {
                    jump();
                }

                if (x1.getBody().getUserData().equals("monster") && x2.getUserData().equals("player"))
                {
                    GameManager.playSound(lostSound);
                    handleDie();
                }

Но каждый раз, когда я прыгаю на «голову» монстра (так что, в основном, я касаюсь его датчиком ног), умершее действие выполняется. Поскольку оба контакта замечены слушателем контактов, это сработает, если я увеличу датчик ног, чтобы высовываться больше из тела игрока (тело игрока - точная форма текстуры спрайта игрока), поэтому было бы похоже, что не было контакта между игроком и монстром. на всех.

Заранее спасибо за любые советы, как правильно обращаться с ним.

Ответы [ 2 ]

1 голос
/ 21 января 2012

Я думаю, что самый простой способ сделать датчик «Стоп» надежным приспособлением. Также сделайте тело игрока меньше. На самом деле вы можете сделать игрока из 3 твердых креплений: голова, тело, ноги. Столкновение по-прежнему будет проходить в правильном направлении, но если вы дотронетесь до монстра ногами, невозможно будет дотронуться до него телом из-за прочного крепления

0 голосов
/ 21 января 2012

Проверьте контакт следующим образом в вашем методе обновления:

for (b2ContactEdge* ce = feet->GetContactList(); ce; ce = ce->next)
{

     const b2Body* bodyA = c->GetFixtureA()->GetBody();
     const b2Body* bodyB = c->GetFixtureB()->GetBody();
     //if one of them is a monster, mark him for being ignored this frame.
}

for (b2ContactEdge* ce = player->GetContactList(); ce; ce = ce->next)
{
     const b2Body* bodyA = c->GetFixtureA()->GetBody();
     const b2Body* bodyB = c->GetFixtureB()->GetBody();
     //if the monster is ignored, jump(), else die() 
}

Возможно, вам также следует проверить, находится ли монстр ниже игрока.

Это C ++, но вы должнысделать что-то подобное в Java.

Надеюсь, это поможет.

...