Nape v2.0.0 — Релиз

Ну вот и случилось — Nape v2.0.0 вышел!
Что тут сказать, Лука проделал большую работу в самой библиотеке и запустил сайт для Nape — napephys.com, где возможно найти туториалы, примеры, отличную документацию и ссылки на саму библиотеку.
Изменений, улучшений и исправлений было очень много, не вижу смысла переписывать их сюда. Тут его официальная новость о релизе, он подробно расписывает, что и как, а здесь ссылка на, возможно, более полный changelog.
Главная, конечно же, и самая ожидаемая фича это — CCD (continuous collision detection).
Она реализована не так как в Box2D. Это простое решение, которое вместе с тем дает бОльшую производительность. Но также не рекомендуется очень обильно использовать ее. Благо, можно очень просто настроить это дело. Немного подробнее рассмотрим.
Теперь класс Body имеет две опции — «disableCCD», «isBullet».
Опция «isBullet» говорит движку надо ли использовать для данного объекта алгоритм CCD. По-умолчанию имеет значение false.
Опция «disableCCD» определяет требуется или не требуется с данным объектом, при столкновении в него объекта помеченного как «isBullet = true», использоваться алгоритм CCD (вопрос стоит так — отключить ли CCD для этого объекта). По-умолчанию имеет значение false.
Пример. Есть у нас два тела wall и bullet.
Если wall.disableCCD = false, а bullet.isBullet = false — для этой пары НЕ будет использоваться CCD.
Если wall.disableCCD = false, а bullet.isBullet = true — для этой пары будет использоваться CCD.
Если wall.disableCCD = true, а bullet.isBullet = true — для этой пары НЕ будет использоваться CCD.

Как видно настроить CCD можно очень гибко и удобно при этом сохранив производительность.
«isBullet = true» — следует использовать для маленьких или для быстро движущихся объектов.

Когда будет время думал обновить туториалы для новой версии, но смотря на новый сайт нейпа даже не знаю надо ли это делать :)

Всем качать, пробовать, знакомится с новым сайтом и слать баги в GitHub — Лука описал порядок добавления бага.

Поделиться в соц. сетях

Опубликовать в LiveJournal
Опубликовать в Google Plus
  • tananuka

    уточню, Если используется CCD (wall.disableCCD = false, а bullet.isBullet = true) то это увеличивает производительность?

    • VirtualMaestro

      нет

      • tananuka

        спасибо, кинетические тела могут получать импульс в nape?

        • tananuka

          тоесть я имел ввиду
          Кинематические тела

    • VirtualMaestro

      Это наоборот уменьшает ее, так как CCD это более требовательный к ресурсам алгоритм, но в противовес своей сложности он дает более точное столкновение, тем самым предотвращает тунелирование (проскакивание одного объекта сквозь другой)

  • Вова

    Можешь помочь решить одну задачу? Нужно сделать стрельбу по врагам и чтоб их смерть отображалась физическим рэгдолом как в игре Зомботрон. Я правильно понял в начале рэгдола нет есть только прямоугольник при попадания в него он превращается в рэгдол и падает? Но мне не понятно еще как сделать рэгдолу отдачу при попадания в прямоугольник?

    • VirtualMaestro

      В блоге хитри есть хороший мануал по созданию персонажа, правда там на бокс2д но это не важно http://xitri.com/2010/12/13/box2d-character-flashgamm-kyiv-2010.html

      Там не один прямоугольник, вместо ног круг должен быть.

      Идея правильная — сначала простой прямоугольник, а в момент смерти подставляем регдол.

      На счет отдачи. Может быть сделана несколькими способами, в зависимости от ситуации и от надобности, но все они базируются на приложении импульса. Например, мы отслеживаем столкновение на событие CbEvent.BEGIN. В этом случае при столкновении можно определить с каким импульсом столкнулись тела. Потом заменить тело на регдол и применить этот импульс к нему.

      (Допустим Body1 это пуля Body2 это герой. Так как мы слушаем CbEvent.BEGIN, InteractionType.COLLISION, ниже для него будет слушатель)

      private function collisionHandler(cb:InteractionCallback):void
      {
      var iterator:ArbiterIterator = cb.arbiters.iterator();
      var arbiter:Arbiter;
      var impulse:Vec3; // Импульс который будем прикладывать к регдолу
      while(iterator.hasNext())
      {
      arbiter = iterator.next();

      if (arbiter.isCollisionArbiter())
      {
      impulse = arbiter.collisionArbiter.normalImpulse(arbiter.body2);
      break;
      }
      }
      }

      • Вова

        Спасибо, но у меня не много не получается приложить правильно полученный импульс. Я делаю так, у меня есть два прямоугольника удаленные друг от друга по одному я стреляю шаром получаю импульс как ты написал и пытаюсь передать его другому прямоугольнику box2.applyImpulse(impulse.xy());. Но он ведет себя не так как первый почему-то падает в противоположную сторону мне кажется это потому что я не указываю в какую точку нужно применить импульс. Если я правильно понимаю в ф-ий applyImpulse() второй параметр отвечает за это но я не как не могу разобраться как туда правильно передать.