|
|
|||||
реакция на столкновение
Здравствуйте, Народ скажите как при столкновении (обнаружении) с объектом например с блоком в игре реализовать не прохождение через него то есть герой не должен проходит через блок , я пытался проделать это разными способами но получались ужасные баги , например персонаж движется в четырех разных направлениях и разумеется завел переменную speed равная 4 , при контакте с блоком speed обнуляю и этот вариант не подходит т. к. герой полностью останавливается, в голову ничего не приходит.
Было бы интересно узнать как Вы это делаете в Своих разработках. заранее спасибо. |
|
|||||
Метод пересечения проекций.
__________________
Я заклинаю вас действовать иначе. |
|
|||||
Цитата:
|
|
|||||
hitTest - Это отстой. Он определяет столкновение по баундинг боксу. Точным такой замер никак нельзя назвать. Смотри в сторону физических движков и почитай про SAT (теорему о разделяющей оси)
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
кстати,SAT в качестве бонуса еще дает вектор наикротчайшего выхода пересекающихся объектов друг из друга, что будет большим плюсом для ТС.
Вот давным давно делал свой платформер на SAT, но, как водится, забросил Управление стрелками. Последний раз редактировалось undefined; 26.02.2016 в 21:54. |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
да, показал эту демку тогдашнему начальству- сказали круто,как-нибудь воспользуемся.А потом меня уволили
|
|
|||||
Потому что коллизия неверно рассчитывается
__________________
Я заклинаю вас действовать иначе. |
|
|||||
Цитата:
Цитата:
p.s. поменял с TouchEvent на MouseEvent. |
|
|||||
Вот код
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, время: 06:49. |
|
« Предыдущая тема | Следующая тема » |
|
|