Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   реакция на столкновение (http://www.flasher.ru/forum/showthread.php?t=212498)

zackscript 26.02.2016 19:37

реакция на столкновение
 
Здравствуйте, Народ скажите как при столкновении (обнаружении) с объектом например с блоком в игре реализовать не прохождение через него то есть герой не должен проходит через блок , я пытался проделать это разными способами но получались ужасные баги , например персонаж движется в четырех разных направлениях и разумеется завел переменную speed равная 4 , при контакте с блоком speed обнуляю и этот вариант не подходит т. к. герой полностью останавливается, в голову ничего не приходит.
Было бы интересно узнать как Вы это делаете в Своих разработках.
заранее спасибо.

Bletraut 26.02.2016 20:58

Метод пересечения проекций.

zackscript 26.02.2016 21:08

Цитата:

Метод пересечения проекций.
это только обнаружение ? я например использую простой HitTest () не важно какой важно реакция на дедект:)

caseyryan 26.02.2016 21:19

hitTest - Это отстой. Он определяет столкновение по баундинг боксу. Точным такой замер никак нельзя назвать. Смотри в сторону физических движков и почитай про SAT (теорему о разделяющей оси)

undefined 26.02.2016 21:38

Вложений: 1
кстати,SAT в качестве бонуса еще дает вектор наикротчайшего выхода пересекающихся объектов друг из друга, что будет большим плюсом для ТС.
Вот давным давно делал свой платформер на SAT, но, как водится, забросил :) Управление стрелками.
sat.swf   (5.7 Кб)

caseyryan 26.02.2016 21:43

Цитата:

но, как водится, забросил
Зря забросил) Уже вижу неплохую мобильную игру на таком двигле) аля Rayman :D

undefined 26.02.2016 21:46

да, показал эту демку тогдашнему начальству- сказали круто,как-нибудь воспользуемся.А потом меня уволили :D

Bletraut 26.02.2016 21:57

Цитата:

Сообщение от zackscript (Сообщение 1192170)
Здравствуйте, Народ скажите как при столкновении (обнаружении) с объектом например с блоком в игре реализовать не прохождение через него то есть герой не должен проходит через блок...

Потому что коллизия неверно рассчитывается

zackscript 26.02.2016 21:58

Вложений: 1
Цитата:

hitTest - Это отстой
знаю , но я использую его для прямоугольных объектов
Цитата:

почитай про SAT (теорему о разделяющей оси)
я читал про эту теорему там описываются только как ОБНАРУЖИТЬ сложные тела, но меня интересует другое как Вы уже знаете, например у меня в сценарии возникает одна проблема: когда герой ударяется о блок то он прекрасно прекращает своё движение но если еще раз щелкнуть по кнопке "того же направления "(использую кнопки зарегистрированные тач события ) то он проникает в этот блок и с каждым щелчком он движется на 4 пикселя в сторону .
p.s. поменял с TouchEvent на MouseEvent.
Tank.swf   (4.6 Кб)

zackscript 26.02.2016 22:00

Вот код
Код AS3:

package 
{
        import flash.display.MovieClip;
        import flash.events.TouchEvent;
        import flash.events.Event;
        import flash.ui.Multitouch;
        import flash.ui.MultitouchInputMode;
        import flash.desktop.NativeApplication;
        public class Tank extends MovieClip
        {
                private var Speed:Number = 4;
                private var _left:Boolean = false;
                private var _right:Boolean = false;
                private var _up:Boolean = false;
                private var _down:Boolean = false;
                private var platforms:Array = new Array  ;
                private var platform;
                public function Tank()
                {
                        Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
                        tank.stop();
                        //----------------------------------------------------------------------------------------------//
                        left.addEventListener(TouchEvent.TOUCH_BEGIN,leftTrue);
                        right.addEventListener(TouchEvent.TOUCH_BEGIN,rightTrue);
                        up.addEventListener(TouchEvent.TOUCH_BEGIN,upTrue);
                        down.addEventListener(TouchEvent.TOUCH_BEGIN,downTrue);
                        //----------------------------------------------------------------------------------------------//
                        left.addEventListener(TouchEvent.TOUCH_END,leftFalse);
                        right.addEventListener(TouchEvent.TOUCH_END,rightFalse);
                        up.addEventListener(TouchEvent.TOUCH_END,upFalse);
                        down.addEventListener(TouchEvent.TOUCH_END,downFalse);
                        //----------------------------------------------------------------------------------------------//
                        left.addEventListener(TouchEvent.TOUCH_OUT,leftOut);
                        right.addEventListener(TouchEvent.TOUCH_OUT,rightOut);
                        up.addEventListener(TouchEvent.TOUCH_OUT,upOut);
                        down.addEventListener(TouchEvent.TOUCH_OUT,downOut);
                        //----------------------------------------------------------------------------------------------//
                        stage.addEventListener(Event.ENTER_FRAME,moveTank);
                        for (var i:int = 0; i < map.numChildren; i++)
                        {
                                platforms.push(map.getChildAt(i));
                        }
                }
                public function leftTrue(e:TouchEvent)
                {
                        _left = true;
                        tank.gotoAndStop("left");
                }
                public function rightTrue(e:TouchEvent)
                {
                        _right = true;
                        tank.gotoAndStop("right");
                }
                public function upTrue(e:TouchEvent)
                {
                        _up = true;
                        tank.gotoAndStop("up");
                }
                public function downTrue(e:TouchEvent)
                {
                        _down = true;
                        tank.gotoAndStop("down");
                }
                //----------------------------------------------------------------------------------------------//
                public function leftFalse(e:TouchEvent)
                {
                        _left = false;
                }
                public function rightFalse(e:TouchEvent)
                {
                        _right = false;
                }
                public function upFalse(e:TouchEvent)
                {
                        _up = false;
                }
                public function downFalse(e:TouchEvent)
                {
                        _down = false;
                }
                //----------------------------------------------------------------------------------------------//
                public function leftOut(e:TouchEvent)
                {
                        _left = false;
                }
                public function rightOut(e:TouchEvent)
                {
                        _right = false;
                }
                public function upOut(e:TouchEvent)
                {
                        _up = false;
                }
                public function downOut(e:TouchEvent)
                {
                        _down = false;
                }
                //----------------------------------------------------------------------------------------------//
                public function moveTank(e:Event)
                {
                        if (_left)
                        {
                                tank.x -=  Speed;
                        }
                        if (_right)
                        {
                                tank.x +=  Speed;
                        }
                        if (_up)
                        {
                                tank.y -=  Speed;
                        }
                        if (_down)
                        {
                                tank.y +=  Speed;
                        }
                        detection(tank);
                }
                public function detection(_tank)
                {
                        //перебираем все платформы и проверяем пересечение с персонажем
                        for (var p:int = 0; p < platforms.length; p++)
                        {
                                platform = platforms[p];
 
                                if (_tank.left.hitTestObject(platform))
                                {
                                        _left = false;
                                }
                                if (_tank.right.hitTestObject(platform))
                                {
                                        _right = false;
                                }
                                if (_tank.up.hitTestObject(platform))
                                {
                                        _up = false;
                                }
                                if (_tank.down.hitTestObject(platform))
                                {
                                        _down = false;
                                }
                        }
                }
        }
}



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

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