![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2013
Сообщений: 82
|
Добрый вечер! У меня есть код движение некого объекта, которым можна управлять с помощью клавиатуры:
Но у этого кода есть один недостаток: он позволяет двигать объект только в одну сторону. А мне надо по диагонали. Подскажите, как реализовать? |
|
|||||
|
Регистрация: Aug 2012
Сообщений: 297
|
У этого кода нет недостатков, он работает так, как и должен работать.
|
|
|||||
|
Регистрация: Mar 2006
Адрес: Odessa
Сообщений: 157
|
Попробуйте запоминать нажатые клавиши, а по энтерфрейму проверять их и двигать объект.
Т.е. код движения будет приблизительно таким:
__________________
Не всех война убила - многих покалечила |
|
|||||
|
Регистрация: Aug 2012
Сообщений: 297
|
package massacre { import flash.display.MovieClip; import flash.events.KeyboardEvent; import flash.events.Event; import flash.ui.Keyboard; public class Move extends MovieClip { private var up:Boolean = false; private var down:Boolean = false; private var left:Boolean = false; private var right:Boolean = false; private const SPEED:Number = 1; private var persona:MovieClip; private var s:*; public function Move(setPersona:MovieClip,setStage:*) { init(setPersona,setStage); } private function init(setPersona:MovieClip,setStage:*):void { s = setStage; persona = setPersona; s.addEventListener(KeyboardEvent.KEY_DOWN,downKey); s.addEventListener(KeyboardEvent.KEY_UP,upKey); addEventListener(Event.ENTER_FRAME,move); } private function upKey(event:KeyboardEvent):void { const KEYCODE:* = event.keyCode; switch(KEYCODE) { case Keyboard.LEFT: left = false; break; case Keyboard.RIGHT: right = false; break; case Keyboard.UP: up = false; break; case Keyboard.DOWN: down = false; break; } } private function downKey(event:KeyboardEvent):void { const KEYCODE:uint = event.keyCode; switch(KEYCODE) { case Keyboard.LEFT: left = true; break; case Keyboard.RIGHT: right = true; break; case Keyboard.UP: up = true; break; case Keyboard.DOWN: down = true; break; } } private function move(event:Event):void { if(left) { persona.x -= SPEED; } if(right) { persona.x += SPEED; } if(down) { persona.y += SPEED; } if(up) { persona.y -= SPEED; } } } } |
|
|||||
|
Кстати во всех подобных реализациях движения по диагонали не учитывается общий модуль скорости. Если при такой реализации двигаться по диагонали, то движение по модулю будет быстрее, чем движение (по модулю) по каждой из осей в отдельности. По отдельным осям скорость будет SPEED, а по диагонали будет корень из двух на SPEED
Поэтому нужно заиметь константу SPEED_MAGNITUDE, и по ней вычислять ONE_AXIS_SPEED_MAGNITUDE, которая будет равна SPEED_MAGNITUDE * корень из двух делить на два. Если движемся по диагонали, двигаем обе координаты со скоростью ONE_AXIS_SPEED_MAGNITUDE, а если горизонтально или вертикально, то со скоростью SPEED_MAGNITUDE Потом проверять, нажаты ли обе кнопки, и проверять простым перебором (да, это долго) все варианты нажатий. И еще можно проверять через atan2 куда двигать. У меня где-то был готовый код, скину если найду ===UPDATE=== Нашел код, только он немного не на AS3, но рабочий Оказывается устанавливается скорость по горизонтали, а диагональная вычисляется по формуле Но это не критично if (FlxG.keyboard.pressed("DOWN", "S")) { if (FlxG.keyboard.pressed("LEFT", "A")) { newLocX = x - speedDiag; newLocY = y + speedDiag; angle = 135; } else { if (FlxG.keyboard.pressed("RIGHT", "D")) { newLocX = x + speedDiag; newLocY = y + speedDiag; angle = 45; } else { newLocY = y + SPEED; angle = 90; } } } else { if (FlxG.keyboard.pressed("UP", "W")) { if (FlxG.keyboard.pressed("LEFT", "A")) { newLocX = x - speedDiag; newLocY = y - speedDiag; angle = -135; } else { if (FlxG.keyboard.pressed("RIGHT", "D")) { newLocX = x + speedDiag; newLocY = y - speedDiag; angle = -45; } else { newLocY = y - SPEED; angle = -90; } } } else { if (FlxG.keyboard.pressed("LEFT", "A")) { newLocX = x - SPEED; angle = -180; } else if (FlxG.keyboard.pressed("RIGHT", "D")) { newLocX = x + SPEED; angle = 0; } } } Последний раз редактировалось KumoKairo; 11.12.2013 в 17:31. |
|
|||||
|
Регистрация: Jun 2012
Сообщений: 70
|
Вот недавно было тут http://flashgameblogs.ru/blog/developing/1379.html
и тут http://flashgameblogs.ru/blog/developing/1380.html
__________________
Блог: http://devizgl.blogspot.com/ |
|
|||||
|
Регистрация: Apr 2013
Сообщений: 82
|
Спасибо огромное всем, кто откликнулся!
|
![]() |
![]() |
Часовой пояс GMT +4, время: 20:55. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|