Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Nape] Реализовать адекватное разрушение объектов в Nape. (http://www.flasher.ru/forum/showthread.php?t=203375)

Samuraix 20.09.2013 02:19

Реализовать адекватное разрушение объектов в Nape.
 
Доброго времени суток.
Задача следующая:
есть телоА, которое летит в телоБ. При определенном импульсе/силе столкновения телоБ "разрушается" (просто удаляется). При этом телоА получает обратный импульс, достаточный для разрушения телаБ и летит дальше с уменьшенной скоростью.
Проблемы: я облазил весь гугл и ничего толком по сабжу не нашел. Все пути ведут сюда:
http://deltaluca.me.uk/forum/index.p...8337/#msg_4903

Мысли: я так понимаю, что надо в PreCollisionListener'е получить импульс столкновения, понять, достаточен ли он для уничтожения телаБ. Если да - то дать обратный импульс телуА и вернуть PreFlag.IGNORE, иначе - ничего не делать. Но вот КАК узнать этот импульс - голова кругом идет..

Буду благодарен любым советам..

cleptoman 21.09.2013 11:02

если вы будете вычислять импульс в обработчике, то смысл физ двига пропадает как таковой ибо он уже сам все посчитал...чтобы тело не изменило вектор движения у него должно быть или масса или скорость много больше другого тела.
в любом случае у тела есть арбитры столкновений...вот в нем смотрите
http://napephys.com/docs/types/nape/...onArbiter.html

Samuraix 21.09.2013 23:32

Спасибо за отклик!
Проблему решил, используя первую рекомендацию по указанной мной же ссылке:) Когда открывал тему - был не в адеквате, поэтому не вник.
На всякий случай оставлю решение, которое мне подошло. В precollisionlistener:

Код AS3:

if (obj1 is DestructableActor)
{
        var impactImpulse:Vec2 = obj2.body.velocity.add(callback.arbiter.collisionArbiter.contacts.at(0).position.sub(obj2.body.position).perp().mul(obj2.body.angularVel)).mul(obj2.body.mass);
        var impactResult:Number = (obj1 as DestructableActor).strike(impactImpulse) / obj2.body.mass;
        if (impactResult > 0)
        {
                var xdy:Number = obj2.body.velocity.y / obj2.body.velocity.x;
                var otdachaX:Number = Math.sqrt(impactResult * impactResult / (1 + xdy * xdy));
                var otdacha:Vec2 = Vec2.get( -otdachaX * obj2.body.velocity.x / Math.abs(obj2.body.velocity.x), - otdachaX * xdy * obj2.body.velocity.y / Math.abs(obj2.body.velocity.y));
                obj2.body.applyImpulse(otdacha, callback.arbiter.collisionArbiter.contacts.at(0).position);
                return PreFlag.IGNORE;
        }
 
}
if (obj2 is DestructableActor)
{
        var impactImpulse2:Vec2 = obj2.body.velocity.add(callback.arbiter.collisionArbiter.contacts.at(0).position.sub(obj2.body.position).perp().mul(obj2.body.angularVel)).mul(obj2.body.mass);
        var impactResult2:Number = (obj2 as DestructableActor).strike(impactImpulse2) / obj1.body.mass;
        if (impactResult2 > 0)
        {
                var xdy2:Number = obj1.body.velocity.y / obj1.body.velocity.x;
                var otdachaX2:Number = Math.sqrt(impactResult2 * impactResult2 / (1 + xdy2 * xdy2));
                var otdacha2:Vec2 = Vec2.get( -otdachaX2 * obj1.body.velocity.x / Math.abs(obj1.body.velocity.x), - otdachaX2 * xdy2 * obj1.body.velocity.y / Math.abs(obj1.body.velocity.y));
                obj1.body.applyImpulse(otdacha2, callback.arbiter.collisionArbiter.contacts.at(0).position);
                return PreFlag.IGNORE;
        }
}



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

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