Box2D Actionscript 3 вопрос - PullRequest
       34

Box2D Actionscript 3 вопрос

1 голос
/ 25 апреля 2011

Я создал мир, используя box2d в сценарии действий 3, и у меня есть маленькая коробка для перемещения по клавиатуре влево, вправо и т. Д., Но когда пользователь, например, продолжает нажимать кнопку вверх даже в воздухе, маленький коробка продолжает идти выше.

Как бы я позволил пользователю подниматься в воздух только после того, как он коснулся какой-то фигуры? 1003 *

    C.log("UP Key pressed");
    myChar.SetLinearVelocity(new b2Vec2(0, -1) );
    myChar.ApplyForce(new b2Vec2(0, -100), myChar.GetPosition());

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Обнаружение столкновений во вспышке box2d было одной из самых сложных вещей для меня, когда я только начинал.Информация обо всех столкновениях предоставляется классом слушателей контактов.Чтобы реагировать на определенные коллизии (например, коллизию между myChar и вашими наземными объектами), вам необходимо переопределить функции в классе слушателя базового контакта и убедиться, что контакт является тем, который вас интересует. В частности, переопределите BeginContact иEndContact работает и проверяет, что контакт находится между корпусом игрока и заземлением.Эти функции запускаются, когда два тела сначала соприкасаются и прекращают контакт соответственно, и класс b2Contact, который они принимают в качестве параметра, содержит информацию о столкновении двух приборов.

Итак, в вашей переопределенной функции BeginContact вы должны проверитьпосмотрите, является ли одно тело заземленным, а другое - игроком, а затем установите для вашей заземленной переменной значение true.В вашей переопределенной функции EndContact вы снова проверите, чтобы убедиться, что контакт ссылается на правильные тела, а затем установите для вашей заземленной переменной значение false.Наконец, когда игрок нажимает клавишу прыжка, проверьте заземленную переменную и, если установлено значение true, разрешите игроку прыгать.

Некоторые коды полу-псевдо:

override BeginContact(contact:b2Contact):void {
    check to see whether GetFixtureA().GetBody() or GetFixtureB().GetBody() is ground and the other is player
        grounded = true;
}

override EndContact(contact:b2Contact):void {
    again, check both bodies
        grounded = false;
}

В зависимости от того, как выИзложив свои наземные тела, возможно, лучше было бы вести подсчет количества наземных тел, с которыми в данный момент контактирует игрок, и, если это число больше 0, разрешите игроку прыгать.

Уроки Todd's Box2D были для меня самым полезным ресурсом.Хотя они относятся к box2d 2.02, а не к последним 2.10, приемник контактов аналогичен.Комментарии к коду в исходных файлах box2d также содержат полезные рекомендации по реализации.

Надеюсь, это поможет вам начать.Дайте мне знать, если что-нибудь может быть яснее.

1 голос
/ 25 апреля 2011

Используйте переменную, чтобы отслеживать, заземлен ли объект.Поместите SetLinearVelocity в оператор if, который проверяет эту переменную, и установите для переменной значение false в операторе if:

var grounded:Boolean = true;
...
if (grounded) {
  SetLinearVelocity
  grounded = false;
}

Затем при столкновениях с землей установите переменную обратно в true.

...