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

AlexsWulf 09.01.2009 19:39

Не понятная задержка в движение обьекта
 
Есть следующий код для передвижения объекта.
Код AS3:

public function root () {
                        addChild(the_hero);
                        the_hero.x=200;
                        the_hero.y=200;
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, key_pressed);
                        stage.addEventListener(KeyboardEvent.KEY_UP, key_releassed);
                        addEventListener(Event.ENTER_FRAME, render);
 
                }
                function key_pressed(e:KeyboardEvent):void
                {
                        if (up==false && down==false && left==false && right==false)
                        {       
                        switch(e.keyCode)
                        {       
                                case Keyboard.UP:
                                up=true;
                                break;
 
                                case Keyboard.DOWN:
                                down=true;
                                break;
 
                                case Keyboard.LEFT:
                                left=true;
                                break;
 
                                case Keyboard.RIGHT:
                                right=true;
                                break;
 
                        }
                        }
                }
 
                function key_releassed(e:KeyboardEvent):void
                {
                        switch(e.keyCode)
                        {               
                                case Keyboard.UP:
                                up=false;
                                break;
 
                                case Keyboard.DOWN:
                                down=false;
                                break;
 
                                case Keyboard.LEFT:
                                left=false;
                                break;
 
                                case Keyboard.RIGHT:
                                right=false;
                                break;       
                        }
                }
 
 
                function render(e:Event):void
                {
                        if (up || down){
 
                                if(up){
                                yspeed-=power;
 
                                if (the_hero.y <0)
                                {
                                        yspeed=0;
                                }
                                the_hero.rotation=0;
 
                                }
 
                                if(down){
                                        yspeed+=power;
 
                                        if (the_hero.y >400)
                                        {
                                                yspeed=0;
                                        }
 
                                        the_hero.rotation=180;
                                }
 
                                yspeed*=friction;
 
 
                                the_hero.y+=yspeed;
                        }
 
                        if (left || right)
                        {
                        if(left){
                                xspeed-=power;
                                the_hero.rotation=270;
                        }
 
                        if(right){
                                xspeed+=power;
                                the_hero.rotation=90;
                        }
 
                        xspeed*=friction;
 
 
                        the_hero.x+=xspeed;
                        }
 
                }

Получаю такую проблему :(
Если пользователь поочередно нажимает клавиши движения то все нормально. Но в случае если он нажал сразу две кнопки и потом одну отпустил а вторую оставил нажатый то происходит задержка около секунды прежде чем объект начинает двигаться :(
Подскажите что я сделал не так? Или в данном случае может вообще какоето другое решение нужно использовать?
Заранее благодарю за ответ.

D12 09.01.2009 20:53

Код AS3:

switch(event.keyCode)
{
    case Keyboard.RIGHT :
    rightArrow = true;
    break;
 
    case Keyboard.LEFT :
    leftArrow = true;
    break;
 
    case Keyboard.UP :
    upArrow = true;
    break;
 
    case Keyboard.DOWN :
    downArrow = true;
    break;
 
    //добавь
    default :
    break;
 }

Ошибка возможно в этом, подобный код у меня прерасно работает :)

DarkLight 09.01.2009 21:32

D12, это не нужно.

Проблема в логике:
Нажал первую клавишу: началось движение.
Нажал 2ю: ничего не произошло, т к одно из направлений true
Отпустил первую: все направления стали false

А когда держишь клавишу, через определенный интервал событие нажатия происходит повторно(зажимаем "а" и сначала одна буква, затем еще допечатываются). И в этот раз, т к все false, начинается движение в другую сторону. Все логично.

Alex Lexcuk 09.01.2009 22:15

Передвигать можно так:
Клавиатура получает события нажатия и отпускания кнопок.
Т.е. если нажать кнопку вверх (событие KEY_DOWN) триггерДвиженияВерх = true,
то объект в это время будет двигаться вверх,
пока кнопка нажата,
до тех пор пока не наступит событие отпускания кнопоки вверх KEY_UP
объект перестанет двигаться вверх (триггерДвиженияВерх = false)

Т.е. независимое управление.
пример

http://www.dnadillo.dn.ua/fla/Car-2D.html

Rzer 10.01.2009 02:41

Цитата:

Пара слов про машину, если в машине крутить руль, то она никуда не поедет, нужно нажимать на газ, что-бы она поехала.
А чтобы она остановилась, нужно просто отпустить газ...


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

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