Форум 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=139850)

artur1995g 12.05.2010 23:02

Создание плавной анимации посредством таймера.
 
Здравствуйте, товарищи)

Я, наконец-то написал НОРМАЛЬНО ЕЗДЯЩИЙ танчик!!)

И теперь хочу сделать так, чтобы его ускорение было плавным) Мне в голову пришла идея (быть может она и абсурдна немного): осуществить анимацию посредством цикла for и таймера.

Суть в том, что в цикле переменная i будет отвечать за скорость объекта (она постоянно увеличивается, так что будет и ускорение). А в конце цикла можно поставить таймер, например на 100 мс, чтобы ускорение было не мгновенным. Ограничение скорости будет задаваться в цикле for.

Ниже представлен мой код:

Код AS3:

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;
                }
        }
}

Но, я работал только с простыми таймерами, которые представлены в Муке. С ними все получается. Но здесь, похоже нужно делать вложенные функции.. Помогите мне пожалуйста реализовать мою задумку ;)

Заранее спасибо Вам)

i.o. 12.05.2010 23:22

Вам не в цикле for нужно ускорение считать, а в обработчике движения, т.е в handler_enterFrame.

Вообще, например, было бы удобно сделать: единичный вектор для направления движения и переменную, отвечающую за скорость. Нажатая кнопка "вперед" отвечала бы за прибавление скорости, отжатая - за снижение. А кнопками влево-вправо вы бы крутили вектор направления. Тогда движение рассчитывалось бы как:

Код AS3:

direction.normalize();
this.x += speed * direction.x;
this.y += speed * direction.y;
this.rotation = Math.atan2( direction.y, direction.x );


Wolsh 12.05.2010 23:34

Прибавлять к координате не постоянное число (у Вас 5), а переменную (ее обычно называют speed или step - смысл понятен). Эту переменную обнулять при отпускании клавиши (остановке танка), а вобработчике ентерФрейм, прежде чем ее прибавить к координате - увеличивать на 0.1 (подберете) и проверять, не стала ли больше номинальной "скорости"
Код AS1/AS2:

speed = Math.min(speed + 0.1, 5);
this.x += speed;

Добавлено через 1 час 5 минут
Типа так (спрайт на мувиклип поменяйте сами))
Код AS3:

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;
                }
        }
}



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

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