Как обнаружить столкновение между тремя объектами одновременно в Box2D? - PullRequest
2 голосов
/ 24 марта 2011

Я новичок в Objective-C. В настоящее время я работаю над игрой, использующей Cocos2D и Box2D. Моя проблема в том, что когда сталкиваются 3 объекта, игра вылетает. Теперь позвольте мне подробно описать мою игру:

В моей игре главный герой стоит на вершине здания. Ниже здания есть эта дорога. Враги проходят по дороге с различной случайной скоростью, входя в экран справа и выходя слева. Я создал врагов как b2_kinematicBodies и установил случайную скорость для каждого из них, используя SetLinearVelocity(). Главный герой стреляет во врагов. Снаряд (объект стрельбы) - b2_dynamicBody. Когда снаряд поражает врагов, и снаряд, и противник уничтожаются. Во время игры иногда врага, движущегося с низкой скоростью, пересекает тот, который движется с более высокой скоростью. Если снаряд поражает двух врагов как раз в тот момент, когда они перекрывают друг друга, и один собирается пройти мимо другого, игра вылетает! Пожалуйста, помогите мне с этим.

Я обнаружил столкновение, используя b2contactListener класс.

Одна вещь, которую я раньше не упоминал, - это то, что я не создаю врагов как отдельные отдельные тела. Вместо этого я создаю его один раз и заставляю его двигаться, и я вызываю этот метод (который создает врагов и заставляет их двигаться) внутри init, как показано ниже:

[self schedule:@selector(addRightTarget) interval:2.0];

Ответы [ 3 ]

1 голос
/ 20 мая 2011

Я считаю, что проблема в том, что коллизии рассчитываются до того, как ваш обработчик получит какие-либо вызовы.Это означает, что когда ваш обработчик вызывается, пуля попала в 2 объекта.Таким образом, вы получаете 2 отзыва, как показано ниже.

Обнаружено столкновение: Bullet + Enemy1

  • Destroy Enemy1
  • Destroy Bullet

Обнаружено столкновение: Пуля + Враг2

  • Уничтожить врага2
  • Уничтожить пулю [CRAAAASH !!!Вы только что попытались удалить несуществующий объект]

1-й: вы не должны удалять ничего, кроме как в вашей функции шага (как кто-то упоминал в другом ответе)

2-й: выбородин из них:

  • Сделайте ваш список / массив удаляемых объектов «установленным» или реализованным таким образом, чтобы избежать дубликатов.
  • Проверка существованияваш объект в мире
1 голос
/ 27 марта 2011

Столкновение происходит только между 2 объектами в Box2D. Таким образом, в упомянутом вами сценарии вы получите несколько событий столкновения, которые могут быть

Враг-1 и Враг-2 Враг-1 и Пуля Враг-2 и Пуля

Таким образом, одной из возможных причин сбоя может быть то, что вы не ожидаете столкновения (Enemy-1 и Enemy-2), и вы обрабатываете его так, как будто вы столкнулись между (Enemy-1 и Bullet), так что вы можете привести его в неправильный класс. Убедитесь, что вы проверяете тип класса "isKindOf" перед тем, как его привести. Также вы можете использовать фильтрацию контактов и / или назначать маски категорий своим врагам, чтобы они не сталкивались друг с другом, а только с пулей.

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

0 голосов
/ 04 мая 2012

Я использовал довольно дешевый обходной путь.Я попеременно создавал вражеские светильники разных размеров (отличающихся на несколько пикселей).Так что теперь, если я снимаю их, даже когда они перекрываются, приложение не падает (потому что только большой объект сталкивается и уничтожается).Это служит моей цели.Большое спасибо за вашу помощь.Я очень ценю это!:)

...