#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», когда коробка столкнется с землей.