Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Непонятные особенности KeyboardEvent (http://www.flasher.ru/forum/showthread.php?t=124235)

Герыч 24.04.2009 13:09

Непонятные особенности KeyboardEvent
 
Во всех нормальных флэш играх одновременное нажатие кнопки вверх и кнопки влево обрабатывается нормально. Но у меня увы это не выходит.. Буду премного благодарен, если кто-нибудь мне объяснит причину..

Как я делаю:
Код AS3:

package gerich {
        import flash.display.MovieClip;
        import flash.events.*;
        import flash.ui.Keyboard;
 
        dynamic public class Spaceship extends MovieClip {
                var speed:Number=1;
 
                public function Spaceship() {
                        rotation=0;
                        stage.addEventListener(KeyboardEvent.KEY_DOWN,  KeyDown);
                        addEventListener(Event.ENTER_FRAME,        Update);
 
                }
 
                public function Update(e : Event):void {
                        y-=Math.cos(rotation/180*3.14)*speed;
                        x+=Math.sin(rotation/180*3.14)*speed;
 
                }
 
                //по идее должны отлавливаться все нажатия по очереди
                public function KeyDown(e : KeyboardEvent):void {
                        if(e.keyCode == Keyboard.LEFT){trace("left"); rotation-=1;}
                        if(e.keyCode == Keyboard.RIGHT){trace("right"); rotation+=1;}
                        if(e.keyCode == Keyboard.UP){trace("up"); speed+=0.05;}
                        if(e.keyCode == Keyboard.DOWN)
                        {
                                trace("down");
                                speed-=0.05;
                                if(speed<0) speed=0;
                        }
 
                }
 
        }
}

при нажатии кнопки вправо на консоль идёт последовательность:
Код:

right
right
right
right
right
...

потом, не отпуская зажимаю вверх, и кнопка вправо начинает игнорироваться:
Код:

right
right              //была нажата вправо
right
up                //нажал вверх
up
up
up
up
up
..

а хотелось бы, чтобы я с примерно равными пеиодами времени получал бы и вверх и вправо. как-то так:
Код:

up
right
right
up
right
up
up
right
..

Объясните, если знаете.. спасибо

cleptoman 24.04.2009 13:15

попробуйте опереться на флаги..на кейдаун флаг = тру, на кейап - фэлс

DarkLight 24.04.2009 13:23

Это особенности обработки клавиатурных событий.
И аккуратнее со множественными нажатиями стрелок, существуют комбинации, которые не работают. Было где-то хорошее исследование на эту тему, выяснилось что на разных компьютерах могут не работать разные комбинации. С этим продолжают сталкиваться:
http://board.flashkit.com/board/showthread.php?t=793134

Герыч 24.04.2009 22:09

Цитата:

Сообщение от cleptoman (Сообщение 815175)
попробуйте опереться на флаги..на кейдаун флаг = тру, на кейап - фэлс

как я понимаю, вы имеете ввиду Key.isDown() ? поискал это в AS3-такого нет. Если есть способ использовать классы младших версий в 3-ей, скажите, пожалуйста:rolleyes:

Добавлено через 15 минут
Вот нашёл нечто похожее на Key в AS2 (KeyObject):
Код AS3:

package com.senocular.utils {
 
        import flash.display.Stage;
        import flash.events.KeyboardEvent;
        import flash.ui.Keyboard;
        import flash.utils.Proxy;
        import flash.utils.flash_proxy;
 
        /**
        * The KeyObject class recreates functionality of
        * Key.isDown of ActionScript 1 and 2
        *
        * Usage:
        * var key:KeyObject = new KeyObject(stage);
        * if (key.isDown(key.LEFT)) { ... }
        */

        dynamic public class KeyObject extends Proxy {
 
                private static var stage:Stage;
                private static var keysDown:Object;
 
                public function KeyObject(stage:Stage) {
                        construct(stage);
                }
 
                public function construct(stage:Stage):void {
                        KeyObject.stage = stage;
                        keysDown = new Object();
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
                        stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
                }
 
                flash_proxy override function getProperty(name:*):* {
                        return (name in Keyboard) ? Keyboard[name] : -1;
                }
 
                public function isDown(keyCode:uint):Boolean {
                        return Boolean(keyCode in keysDown);
                }
 
                public function deconstruct():void {
                        stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
                        stage.removeEventListener(KeyboardEvent.KEY_UP, keyReleased);
                        keysDown = new Object();
                        KeyObject.stage = null;
                }
 
                private function keyPressed(evt:KeyboardEvent):void {
                        keysDown[evt.keyCode] = true;
                }
 
                private function keyReleased(evt:KeyboardEvent):void {
                        delete keysDown[evt.keyCode];
                }
        }
}


DarkLight 24.04.2009 22:27

Цитата:

поискал это в AS3-такого нет.
Это такая проблема? Вешаем на stage например обработчик keyDown/keyUp, по нажатию добавляем в массив код нажатой клавиши, по отжатию убираем, и Key.isDown реализуем как keys.indexOf(код) != -1 , где keys - вышеназванный массив

Vektor 25.04.2009 21:58

Попробовал сделать как советовали, получилось, что-то вроде этого.
главное что работает.
Код AS3:

package {
        import flash.display.MovieClip;
        import flash.events.*;
        import flash.ui.Keyboard;
 
        dynamic public class Key extends MovieClip {;
        var aKey:Array = [];
 
        public function Key() {
                stage.addEventListener(KeyboardEvent.KEY_DOWN,  KeyDown);
                stage.addEventListener(KeyboardEvent.KEY_UP,  KeyUp);
        }
        public function KeyDown(e : KeyboardEvent):void {
                if (e.keyCode == Keyboard.RIGHT) {
                        aKey[0] = "RIGHT";
                }
                if (e.keyCode == Keyboard.UP) {
                        aKey[1] = "UP";
                }
                if (aKey.indexOf("RIGHT") > -1) {
                        trace("RIGHT");
                }
                if (aKey.indexOf("UP") > -1) {
                        trace("UP");
                }
        }
        public function KeyUp(event : KeyboardEvent):void {
                if (event.keyCode == Keyboard.RIGHT) {
                        aKey[0] = "";
                }
                if (event.keyCode == Keyboard.UP) {
                        aKey[1] = "";
                }
        }
}
}


AL.exe 25.04.2009 22:04

Цитата:

Было где-то хорошее исследование на эту тему, выяснилось что на разных компьютерах могут не работать разные комбинации.
Дело чаще в самой клавиатуре, похоже.


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

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