|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Mar 2010
Адрес: Казань)
Сообщений: 18
|
Создание плавной анимации посредством таймера.
Здравствуйте, товарищи)
Я, наконец-то написал НОРМАЛЬНО ЕЗДЯЩИЙ танчик!!) И теперь хочу сделать так, чтобы его ускорение было плавным) Мне в голову пришла идея (быть может она и абсурдна немного): осуществить анимацию посредством цикла for и таймера. Суть в том, что в цикле переменная i будет отвечать за скорость объекта (она постоянно увеличивается, так что будет и ускорение). А в конце цикла можно поставить таймер, например на 100 мс, чтобы ускорение было не мгновенным. Ограничение скорости будет задаваться в цикле for. Ниже представлен мой код: package { import flash.display.*; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; public class Tank extends MovieClip { private var moveFlag:Boolean=false; private var move:String; public function Tank() { addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); } function onKeyDown(e:KeyboardEvent):void { trace(e.keyCode + " x=" + this.x + " y=" + this.y); if (! moveFlag) { moveFlag=true; if (e.keyCode==37) { move="left"; } else if (e.keyCode == 39) { move="right"; } else if (e.keyCode == 38) { move="up"; } else if (e.keyCode == 40) { move="down"; } this.addEventListener(Event.ENTER_FRAME, handler_enterFrame); this.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); } } function handler_enterFrame(e:Event):void { /*в этой функции представлены условия движения в стороны*/ if (move==="left") { this.rotation=270; this.x-=5; } else if (move === "right") { this.rotation=90; this.x+=5; } else if (move === "up") { this.rotation=0; this.y-=5; } else if (move === "down") { this.rotation=180; this.y+=5; } } private function onKeyUp(e:KeyboardEvent):void { this.removeEventListener(KeyboardEvent.KEY_UP, onKeyUp); this.removeEventListener(Event.ENTER_FRAME, handler_enterFrame); moveFlag=false; } } } Заранее спасибо Вам) |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Вам не в цикле for нужно ускорение считать, а в обработчике движения, т.е в handler_enterFrame.
Вообще, например, было бы удобно сделать: единичный вектор для направления движения и переменную, отвечающую за скорость. Нажатая кнопка "вперед" отвечала бы за прибавление скорости, отжатая - за снижение. А кнопками влево-вправо вы бы крутили вектор направления. Тогда движение рассчитывалось бы как: Последний раз редактировалось i.o.; 12.05.2010 в 23:32. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Прибавлять к координате не постоянное число (у Вас 5), а переменную (ее обычно называют speed или step - смысл понятен). Эту переменную обнулять при отпускании клавиши (остановке танка), а вобработчике ентерФрейм, прежде чем ее прибавить к координате - увеличивать на 0.1 (подберете) и проверять, не стала ли больше номинальной "скорости"
Добавлено через 1 час 5 минут Типа так (спрайт на мувиклип поменяйте сами)) package { import flash.display.*; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; public class Tank extends Sprite { private var moveFlag:Boolean=false; private var move:String; private var _speedX:Number = 0; private var _speedY:Number = 0; //// public function Tank() { addEventListener(Event.ADDED_TO_STAGE, init); } private function init(event:Event):void { stage.addEventListener(KeyboardEvent.KEY_DOWN, onKey); } //// function onKey(e:KeyboardEvent):void { trace(e.keyCode + " x=" + this.x + " y=" + this.y); if (! moveFlag) { _speedX = _speedY = 0.25; moveFlag=true; if (e.keyCode==37) { move="left"; } else if (e.keyCode == 39) { move="right"; } else if (e.keyCode == 38) { move="up"; } else if (e.keyCode == 40) { move="down"; } this.addEventListener(Event.ENTER_FRAME, handler_enterFrame); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); } } function handler_enterFrame(e:Event):void { /*в этой функции представлены условия движения в стороны*/ if (move==="left") { this.rotation=270; _speedX = Math.min(5, _speedX * 1.1); this.x-=_speedX; } else if (move === "right") { _speedX = Math.min(5, _speedX * 1.1); this.rotation=90; this.x+=_speedX; } else if (move === "up") { _speedY = Math.min(5, _speedY * 1.1); this.rotation=0; this.y-=_speedY; } else if (move === "down") { _speedY = Math.min(5, _speedY * 1.1); this.rotation=180; this.y+=_speedY; } } private function onKeyUp(e:KeyboardEvent):void { stage.removeEventListener(KeyboardEvent.KEY_UP, onKeyUp); this.removeEventListener(Event.ENTER_FRAME, handler_enterFrame); moveFlag=false; } } }
__________________
Reality.getBounds(this); |
Часовой пояс GMT +4, время: 17:30. |
|
« Предыдущая тема | Следующая тема » |
Теги |
анимация , Задержка , плавное ускорение , Таймер , ускорение |
Опции темы | |
Опции просмотра | |
|
|