Вопрос Box2D Actionscript 3

#flash #actionscript-3 #flash-builder #box2d

#flash #actionscript-3 #flash-конструктор #box2d

Вопрос:

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

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

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

Комментарии:

1. Привет, Дэниел, тебя может заинтересовать это: gotoandlearn.com/play.php?id=135 .

Ответ №1:

Обнаружение столкновений в box2d flash было для меня одной из самых сложных задач, когда я только начинал.

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

Итак, в вашей переопределенной функции beginContact вы бы проверили, является ли одно из тел основным телом, а другое — плеером, а затем установили для вашей переменной grounded значение true . В вашей переопределенной функции EndContact вы бы снова проверили, чтобы убедиться, что контакт ссылается на правильные тела, а затем установили для вашей заземленной переменной значение false . Наконец, когда игрок нажимает клавишу jump, проверьте переменную grounded и, если 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, разрешить игроку прыгать.

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

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

Ответ №2:

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

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

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

Комментарии:

1. Да, но как мне проверить, обоснован ли он?

2. Создайте объект collider для земли, а затем установите «grounded = true», когда коробка столкнется с землей.