Box2D: Как обнаружить, что объект больше не сталкивается с другим объектом? - PullRequest
1 голос
/ 25 марта 2009

Flash Box2D Вопрос (но я думаю, что «вспышка» не имеет значения)

Предположим, есть объект A, который является персонажем и объект B, который является землей

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

Существует окно для прослушивания контактов 2d, которое я могу обнаружить, когда объект касается других объектов, поэтому я могу использовать его для прослушивания, когда персонаж касается земли. Но как я узнаю, что персонаж покинул землю?

Спасибо за чтение.

Ответы [ 5 ]

4 голосов
/ 13 апреля 2009

Предположим, есть объект А, который персонаж и объект B, который это земля

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

Предполагая, что ваш объект A b2Body называется objectA и objectB - это другая b2Body, называемая objectB, а ваш мир называется m_world. Если объектB это земля, я думаю, она имеет плотность 0, что делает его статичным. Если вы хотите проверить, находится ли объект A над объектом B, у вас есть два варианта, либо через сами тела, что означает использование единиц измерения box2d (1 метр = 30 пикселей), либо используя ссылку на ваши пользовательские клипы, установленные через свойство userData.

Преимущество использования второго, я полагаю, заключается в том, что вы будете использовать обычные пиксельные единицы, имея в виду, что ваша точка регистрации находится в центре не в 0,0.

Итак, в вашем цикле обновления (где вы вызываете m_world.Step) у вас будет что-то вроде:

if((objectA.m_userData.y + objectA.m_userData.height*.5) < (objectB.m_userData.y-objectB.m_userData.height*.5)) trace('objectA is above ground');
else trace('objectB is on the ground');

Просто прочитайте ваш комментарий и обновите снова.

Я начал писать команду jsfl для flash, которая получает x, y, width, height от элементов на сцене и генерирует код box2d. Я использовал это, чтобы сделать эту простую игру: http://www.disturbmedia.com/games/breakfast Кажется, мне не нужно изобретать велосипед, потому что кто-то уже сделал что-то довольно последовательное. Только что вернулся из LFPUG, где Карлос Уллоа также немного рассказал о box2d и указал на эту вещь:

http://www.sideroller.com/wck/

Кажется, он генерирует координатные массивы для более сложных определений форм, что вам и нужно. В некотором смысле это не полный ответ на ваш конкретный вопрос, но это шаг вперед.

Из вашего описания игра звучит действительно интересно. Держите нас в курсе:)

2 голосов
/ 28 октября 2011

Я думаю, что вы искали это:

override public function EndContact(contact:b2Contact):void
        {
            if (contact.GetFixtureA().GetBody().GetUserData() != null)
            {
1 голос
/ 09 февраля 2011

Я уверен, что версия box2d изменилась с тех пор, как вы задали свой вопрос.

общий способ проверки столкновения с землей в настоящее время заключается в проверке направления "нормального" столкновения.

если он направлен вверх, тогда продолжайте и предположите, что герой заземлен, и позвольте идти.

чтобы ответить на другие части вашего вопроса

есть BeginContact и EndContact.

Я часто сохраняю переменную boundan: Boolean на моем герое, чтобы отслеживать, и я даже вручную устанавливаю ее в false при прыжке, чтобы попытаться избежать прыжка более одного раза, прежде чем герой покинет землю.

Надеюсь, это поможет некоторым.

1 голос
/ 16 декабря 2010

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

Как я уже сказал, это глупо, но мне еще предстоит увидеть что-то еще настолько простое, что работает.

1 голос
/ 29 апреля 2009

В приемнике контактов есть метод Remove (b2ContactPoint). Этот метод вызывается физическим движком, два тела больше не соприкасаются. Другими словами, у них больше нет точек соприкосновения. В этот момент вы можете обнаружить, что тело A, являющееся действующим лицом, не является плавающим.

Еще одним классным решением будет передача луча от актера на землю, проверьте расстояние между ними, и вы сможете определить, плывете ли вы или идете. Надеюсь, что это работает

...