nape InteractionFilter

govnoproger.ru > as3 > nape InteractionFilter

Решил дописать старый пост.
Поговорим об основе основ в nape — InteractionFilter.

Для тех кто в танке InteractionFilter — позволяет делать так, чтобы одно тело проходило сквозь другое.
Так-же от него достаточно сильно зависит производительность вашей флешки.

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

Конечно-же мы можем дать ключу сенсорную маску 0xffffffff — при этом он будет проверяться со всеми телами.
Но ведь нам нужна проверка только с игроком, не так ли?
Если вы всё ещё не понимаете просто читайте сверху вниз.

Рассмотрим конструктор и базовую формулу:

new InteractionFilter(?collisionGroup:Int=1,?collisionMask:Int=0xffffffff,?sensorGroup:Int=1,sensorMask:Int=0xffffffff,?fluidGroup:Int=1,?fluidMask:Int=0xffffffff)

Возможно вы скажете — вай-вай-вай, как много букв. В принципе вы будете правы, не обязательно указывать сразу всё.

Рассмотрим:

  • collisionGroup — это группа отвечает за физические столкновения, не путайте её слоями. Слоёв в новом nape нету!
    Все группы по умолчанию 1 (взаимодействует со всеми).
  • collisionMask — это маска отвечает за физические столкновения. Маска это не слой.
    по умолчанию все маски -1, тоесть 0xffffffff (взаимодействует со всеми).
  • sensorGroup — сенсорная группа
  • sensorMask — сенсорная маска
  • fluidGroup — жидкостная группа
  • fluidMask — жидкостная маска

Дальше самое важное:
Два шейпа взаимодействуют если выполняется условие

(a.group&b.mask != 0) && (b.group&a.mask != 0)

Иными словами маски проверяются с группами предметов! Именно так определяется будут ли они взаимодействовать.

fluid имеет высший приоритет — после чего идёт collisions и sensors.
В принципе это понятно почему.

А теперь самое интересное, перейдём к практике:
В данных примерах мы не будем рассматривать жидкостное воздействие.

У нас есть тело игрока.
Его InteractionFilter таков: (1,0xffffffff,1,0xffffffff)
То-есть тупо дефолтный InteractionFilter, который взаимодействует со всем.

Мы хотим чтобы игрок подобрал ключ, после чего он смог пройти сквозь дверь.

Логика: переносим ключ в другую группу и из его маски вычитаем группу игрока.
по дефолту маска 0xffffffff, вычитаем из неё группу 1

colissiongroup=2
collisionMask&=~1
collisionMask=0x02
InteractionFilter(2,0x02,1,0xffffffff)

Отлично теперь ключ не сталкивается с игроком.

Далее идёт дверь:
Назначаем двери новую группу. Маска двери 0xffffffff.

colissiongroup=int(1<<10)=1024 //можно другую 
collisionMask=0xffffffff
InteractionFilter(1024,0xffffffff,1,0xffffffff)

Далее сценарий таков — игрок подбирает ключ.
Меняем маску игрока.

Player.someshape.filter.collisionMask&=~1024;

Если игрок потерял ключ то:
Меняем маску игрока.

Player.someshape.filter.collisionMask|=1024;

Аналогично работаем с жидкостными и сенсорными.

Это всё что я хотел сказать.

Рекомендую:

2.9.2011 | последняя редакция: 02.09.2011 |
  1. Сергей
    2.9.2011 в 21:13

    Не осилил, если честно, добуквенно, но на уровне абзацев суть ясна 🙂

  2. admin
    2.9.2011 в 21:20

    А зачем тебе это осиливать?
    Ты что nape ковыряешь?
    Как блог кстати? пора бы уже.

  3. Сергей
    3.9.2011 в 10:07

    Я про Nape ради интереса твои посты читаю, пока только общее представление имею… Блог тестовый висит, но пока нету пару часиков свободных ему времени уделить, думаю на след неделе запущу нормально

  4. z_Bot
    15.1.2012 в 09:28

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

  5. admin
    15.1.2012 в 11:03

    Спасибо.
    Какой внешний вид?
    Чего именно?