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

Anabel 11.12.2013 00:02

Движение по диагонали
 
Добрый вечер! У меня есть код движение некого объекта, которым можна управлять с помощью клавиатуры:
Код AS3:

function dvig(e:KeyboardEvent):void
{
        if (e.keyCode == Keyboard.LEFT)
        {
                er.x -=  1;
        }
        if (e.keyCode == Keyboard.RIGHT)
        {
                er.x +=  1;
        }
        if (e.keyCode == Keyboard.DOWN)
        {
                er.y +=  1;
        }
        if (e.keyCode == Keyboard.UP)
        {
                er.y -=  1;
        }
}

Но у этого кода есть один недостаток: он позволяет двигать объект только в одну сторону. А мне надо по диагонали. Подскажите, как реализовать?

Dip52 11.12.2013 01:03

У этого кода нет недостатков, он работает так, как и должен работать.

RandomUser 11.12.2013 01:19

Попробуйте запоминать нажатые клавиши, а по энтерфрейму проверять их и двигать объект.
Т.е. код движения будет приблизительно таким:

Код AS3:

function updateMove() : void
{
        if (keyboardManager.keyIsDown(Keyboard.RIGHT)) er.x++;
        if (keyboardManager.keyIsDown(Keyboard.LEFT)) er.x--;
        if (keyboardManager.keyIsDown(Keyboard.DOWN)) er.y++;
        if (keyboardManager.keyIsDown(Keyboard.UP)) er.y--;
}


Dip52 11.12.2013 01:24

Код AS3:

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


KumoKairo 11.12.2013 11:53

Кстати во всех подобных реализациях движения по диагонали не учитывается общий модуль скорости. Если при такой реализации двигаться по диагонали, то движение по модулю будет быстрее, чем движение (по модулю) по каждой из осей в отдельности. По отдельным осям скорость будет SPEED, а по диагонали будет корень из двух на SPEED
Поэтому нужно заиметь константу SPEED_MAGNITUDE, и по ней вычислять ONE_AXIS_SPEED_MAGNITUDE, которая будет равна SPEED_MAGNITUDE * корень из двух делить на два. Если движемся по диагонали, двигаем обе координаты со скоростью ONE_AXIS_SPEED_MAGNITUDE, а если горизонтально или вертикально, то со скоростью SPEED_MAGNITUDE

Потом проверять, нажаты ли обе кнопки, и проверять простым перебором (да, это долго) все варианты нажатий. И еще можно проверять через atan2 куда двигать.

У меня где-то был готовый код, скину если найду

===UPDATE===
Нашел код, только он немного не на AS3, но рабочий
Оказывается устанавливается скорость по горизонтали, а диагональная вычисляется по формуле
Код AS3:

speedDiag = Math.sqrt(SPEED * SPEED / 2);

Но это не критично
Код 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;
                                }
                        }
                }

Еще можно делать простые условия а-ля какая кнопка нажата и вычислять atan2 по значениям нажатых кнопок (допустим, если нажата кнопка ВЛЕВО и ВВЕРХ, то x и y будут равны -1 1 соответственно) Но я почему-то отказался потом от этого метода (не помню почему, но видимо была причина)

vizgl 11.12.2013 17:51

Вот недавно было тут http://flashgameblogs.ru/blog/developing/1379.html
и тут http://flashgameblogs.ru/blog/developing/1380.html

Anabel 11.12.2013 18:22

Спасибо огромное всем, кто откликнулся!


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

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