Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] фильтр столкновений (http://www.flasher.ru/forum/showthread.php?t=170833)

zelibiba84 02.11.2011 23:37

фильтр столкновений
 
Такой вопрос.
Как в box2d сделать фильтрацию столкновений? т.е. чтоб тело "А" проходило сквозь тело "Б", но отскакивало от тела "С".
Спасибо.

goodguy 03.11.2011 11:51

Нужно телам, которые должны сталкиваться задать одну и ту же группу фильтрации и исключить фильтруемые биты, т.е:
Код AS3:

var filter:b2FilterData = new b2FilterData();
filter.groupIndex  = 4;
filter.maskBits        = ~0x0001;                               
_body.GetFixtureList().SetFilterData(filter);

По умолчанию, все тела в бокс2д имеют категорию филтрации 0x0001, в моем коде эта категория исключается из списка контактов с помощью тильды, соответственно, при назначении этого фильтра, тела будут сталкиваться со всеми телами имеющими группу 4 и не будут сталкиваться с телами, имеющими категорию 0x0001. В итоге получится, что категория бит у них самих останется 0x0001 (т.е. как бы они не должны сталкиваться и друг с другом), но благодаря тому, что группа у них одна и та же, они будут сталкиваться между собой.
Надеюсь понятно объяснил )

zelibiba84 03.11.2011 17:17

Вроде понятно))
Однако дело в том, что тела одной группы ("враги") не должны сталкиваться между собой, но должны сталкиваться с телами другой группы, т.е. с персонажем игры.
Тут мне кажется надо как-то по другому...

Некорректно обрисовал проблему сначала. Сорри)

Добавлено через 14 минут
нашел вот чё

Код AS3:

playerShapeDef.filter.categoryBits   = 0x0002;
        monsterShapeDef.filter.categoryBits  = 0x0004;
        playerShapeDef.filter.maskBits      = 0x0004;
        monsterShapeDef.filter.maskBits      = 0x0002;

Добавлено через 31 час 41 минуту
Вот ещё нашёл такой класс, как b2ContactFilter.
Буду разбираться. Суть вроде та же, но выглядит по-проще.

goodguy 07.11.2011 08:35

Цитата:

Вроде понятно))
Все-таки вижу, что не понятно ))
Можно врагам назначить categoryBits, например 0x0004, своим персонажам сделать categoryBits = 0x0003
а потом своим персонажам замаскировать эту категорию бит, например так:
Код AS3:

var filter:b2FilterData = new b2FilterData();
filter.categoryBits  = 0x0003; // назначили такую категорию
filter.maskBits        = ~0x0003; // и тут же ее замаскировали                               
_body.GetFixtureList().SetFilterData(filter);

Соответственно, они будут сталкиваться со всеми другими категориями, кроме своей.

Для врагов можно сделать то же самое, но с другой категорией.

Чтобы к маскировке добавить что-то еще, можно сделать это так:
Код AS3:

filter.maskBits         = ~0x0003 & ~ 0x0001; // не будут сталкиваться ни с какими телами, имеющими категорию по умолчанию, и с телами имеющими категорию 0x0003


zelibiba84 07.11.2011 19:33

да не) правда понятно)


Часовой пояс GMT +4, время: 17:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.