2012-01-21 3 views
2

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

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

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(); 
       } 

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

Заранее благодарим за любые советы по правильному обращению с ним.

ответ

1

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

+0

Спасибо, действительно, это работает, на самом деле это был самый простой способ сделать это, у меня было несколько проблем, связанных с телом игрока, но, в конце концов, это работает. Я просто добавил третье твердое приспособление под названием «вниз» - так что теперь есть 2 твердых светильника и один датчик (датчик ноги) – Matim

0

Проверить контакт, как это на ваш методе обновления:

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.

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

+0

Спасибо за ваш ответ, я также проверю это решение. – Matim

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