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

Final Hope 28.05.2013 16:36

Как сделать прыжок при нажатии вверх?
 
Добрый день, уважаемые форумцы. Я пытаюсь написать свою первую игру и никак не могу придумать, как заставить кружок прыгать. Помогите, пожалуйста. Буду весьма благодарен. Мой код показан ниже. Спасибо за внимание.
Код AS3:

package
{
        import flash.display.MovieClip;
        import flash.display.Shape;
        import flash.events.Event;
        import flash.events.KeyboardEvent;
        import flash.geom.Point;
 
        public class Main extends MovieClip
        {
                private var _heroShape:Shape;
                private var _heroSpeed:Point = new Point(0, 0);
                private var _isLefting:Boolean = false;
                private var _isRighting:Boolean = false;
                private var _isUping:Boolean = false;
 
                private static const FLOOR:Number = 400;
                private static const SPEED_DELTA:Number = 1;
                private static const SPEED_DAMPING:Number = 0.9;
                private static const SPEED_MAX:Number = 5;
 
                public function Main()
                {
                        drawHero();
                        drawFloor();
                        stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
                        stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
                }
                //-------------------------------------------------------------
                //
                //  Methods
                //
                //-------------------------------------------------------------
                private function drawHero():void
                {
                        _heroShape = new Shape();
                        _heroShape.graphics.lineStyle(2);
                        _heroShape.graphics.drawCircle(0, -30, 30);
                        _heroShape.x = 275;
                        _heroShape.y = FLOOR;
                        this.addChild(_heroShape);
                }
                private function drawFloor():void
                {
                        this.graphics.lineStyle(2);
                        this.graphics.drawPath(new <int>[ 1, 2 ], new <Number>[ 0, FLOOR, 550, FLOOR ]);
                }
                //-------------------------------------------------------------
                //
                //  Event handlers
                //
                //-------------------------------------------------------------
                private function enterFrameHandler(event:Event):void
                {
                        _heroShape.x += _heroSpeed.x;
                        _heroShape.y += _heroSpeed.y;
                        if (_isLefting == true && Math.abs(_heroSpeed.x) < SPEED_MAX)
                        {
                                _heroSpeed.x += -SPEED_DELTA;
                                if (_heroSpeed.x < -SPEED_MAX)
                                {
                                        _heroSpeed.x = -SPEED_MAX;
                                }
                        }
                        else if (_isRighting == true)
                        {
                                _heroSpeed.x += SPEED_DELTA;
                                if (_heroSpeed.x > SPEED_MAX)
                                {
                                        _heroSpeed.x = SPEED_MAX;
                                }
                        }
                        else
                        {
                                _heroSpeed.x *= SPEED_DAMPING;
                        }
                }
                private function keyDownHandler(event:KeyboardEvent):void
                {
                        switch (event.keyCode)
                        {
                                case 37:
                                {
                                        _isLefting = true;
                                        break;
                                }
 
                                case 39:
                                {
                                        _isRighting = true;
                                        break;
                                }
 
                                case 38:
                                {
                                        _isUping = true;
                                        break;
                                }
                        }
                }
                private function keyUpHandler(event:KeyboardEvent):void
                {
                        switch (event.keyCode)
                        {
                                case 37:
                                {
                                        _isLefting = false;
                                        break;
                                }
 
                                case 39:
                                {
                                        _isRighting = false;
                                        break;
                                }
 
                                case 38:
                                {
                                        _isUping = false;
                                        break;
                                }
                        }
                }
        }
}


Idon'tKnow 28.05.2013 17:39

Не знаю насчёт того лучший ли это вариант. Но можете попробовать этот способ.
Поясню, способ основан на формуле h = at*t + v0*t;
Где:
1. h(t) - высота объекта в момент времени t.
2. a - вектор ускорения.(в нашем случае он положителен, чтобы тянуть объект вниз).
3. v0 - начальная скорость объекта, тот же вектор, направленный вверх при прыжке объекта.

Регулировать скорость прыжка и тому подобное Вы можете через vFirst = v0 и a. Можно и через startUp, прибавляя больше или меньше к нему, собственно, если будет желание, то найдете оптимальную скорость движения объекта.

Если же Вы хотите, чтобы движение занимало определенный промежуток времени, то можете просто замерить расстояние(S = (конечная точка - начальная)) и время продолжения(t). А по Event'у в таймере находить отношение времени:
k = (сколько прошло)/(сколько всего двигаться). Ну и вот это отношение (K) умножать на длину всего пути(S). Можно еще разделить на 2 пути, до верхней точки и до нижней, думаю особых проблем это не вызовет у Вас. Удачи! :)

Надеюсь всё понятно, если что - спрашивайте.

Код AS3:

package 
{
        import flash.display.InteractiveObject;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.KeyboardEvent;
        import flash.display.Shape;
 
 
        /**
        * ...
        * @author Vulcan
        */

        public class Main extends Sprite
        {
        private var vFirst:Number = 2;
        private var startUp:Number = 1;
        private var a:Number = .5;       
        private var circle:Sprite = new Sprite();
        private var groundPos:Number;
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
 
 
 
                        circle.graphics.lineStyle(1);
                        circle.graphics.drawCircle(300, 450, 50);
                        groundPos = 500;
                        addChild(circle);
                        //circle.tabEnabled = true;
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
                        graphics.lineStyle(1);
                        graphics.moveTo(0, 500);
                        graphics.lineTo(500, 500);
 
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                }
 
                private function keyDownListener(e:KeyboardEvent):void {
                        trace("UP!");
                        addEventListener(Event.ENTER_FRAME, enterFrameListener);
                        stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
                }
 
                private function enterFrameListener(e:Event):void {
                        startUp += .1;
                        circle.y +=  (a * startUp * startUp) - vFirst * startUp;
                        if (circle.y >= 0) {
                                trace(circle.y);
                        circle.y = 0;
                        removeEventListener(Event.ENTER_FRAME, enterFrameListener);
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
                        startUp = 1;
                        }
                }
        }       
}

P.S. Насчёт того, что лучше это всё дело пропускать через Frame я не особо уверен, если нужна наибольшая точность, то можете через Timer всё это реализовать.


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

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