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

XpM 28.05.2013 12:51

Не приходит событие клавиатуры
 
Читаю К.Мука "ActionScript 3.0 для Flash. Подробное руководство".
Но паралельно с виртуальным зоопарком решил делать свое жуткое подобие игры. Дошел до обработки событий. И такое дело:
При клике по отрисованому обьекту событие проходит (trace работает), а при нажатии клавиш (в моем случае я взял клавишу вниз) - нет.
Подскажите пожалуйста, где косяк.

Код AS3:

package field 
{
        import flash.display.Sprite;
        import flash.events.*;
 
        public class Hero extends Sprite
        {
                public var heroName:String;
 
                public function Hero(newName:String)
                {
                        this.setName (newName);
                        this.addEventListener (KeyboardEvent.KEY_DOWN, downListener);
                        this.addEventListener (MouseEvent.CLICK, clickHeroListener);
 
                }
                public function addHero(x:int, y:int):void
                {
                        graphics.lineStyle (1)
                        graphics.beginFill (0xCC00FF);
                        graphics.drawCircle (x, y, 25);
                        graphics.endFill ();
                }
                public function setName (newName:String):void
                {
                        heroName = newName;
                }
 
                public function clickHeroListener(e:MouseEvent):void
                {
                        trace (getName ());
                }
 
                public function getName ():String
                {
                        return heroName;
                }
 
                public function downListener(e:KeyboardEvent):void
                {
                        trace ("down");
                }
        }
 
}


Zebestov 28.05.2013 13:29

Темы с названиями "помогите …", "нужна помощь!!!" и подобными закрываются по причине, описанной в пункте 6 правил форума.

А вот события клавиатуры лучше слушать не на каком-либо объекте, а на stage — он всегда в фокусе (если само приложение в фокусе).

Код AS3:

package field 
{
        import flash.display.Sprite;
        import flash.events.*;
 
        public class Hero extends Sprite
        {
                public var heroName:String;
 
                public function Hero(newName:String)
                {
                        this.setName (newName);
                        this.addEventListener (Event.ADDED_TO_STAGE, addedToStageListener);
                        this.addEventListener (MouseEvent.CLICK, clickHeroListener);
                }
 
                public function addHero(x:int, y:int):void
                {
                        graphics.lineStyle (1)
                        graphics.beginFill (0xCC00FF);
                        graphics.drawCircle (x, y, 25);
                        graphics.endFill ();
                }
 
                public function setName (newName:String):void
                {
                        heroName = newName;
                }
 
                public function getName ():String
                {
                        return heroName;
                }
 
                private function addedToStageListener(event:Event):void
                {
                        stage.addEventListener (KeyboardEvent.KEY_DOWN, downListener);
                }
 
                private function clickHeroListener(e:MouseEvent):void
                {
                        trace (getName ());
                }
 
                private function downListener(e:KeyboardEvent):void
                {
                        trace ("down");
                }
        }
 
}


XpM 28.05.2013 13:53

Спасибо, но вы пишете "лучше использовать" - это означает, что мой код неверен в принципе?

Idon'tKnow 28.05.2013 13:59

Можете просто определить свойство
Код AS3:

tabEnabled = true;

Примерно вот так:

Код AS3:

 
            var circle:Sprite = new Sprite();
                        circle.graphics.lineStyle(1);
                        circle.graphics.drawCircle(50, 50, 50);
                        stage.addChild(circle);
                        circle.tabEnabled = true;
                        circle.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
 
private function keyDownListener(e:KeyboardEvent):void
        {
                        trace("down!");
                }

Добавлено через 1 минуту
Попробуйте включить tabEnabled своему герою и переключать фокус через Tab, должно помочь.

Zebestov 28.05.2013 14:14

Цитата:

Сообщение от XpM (Сообщение 1135221)
Спасибо, но вы пишете "лучше использовать" - это означает, что мой код неверен в принципе?

Верен ли способ, оценивают по результатам. Твой код ведь не дал ожидаемого эффекта? Причина в том, что объект может посылать события клавиатуры, только когда он в фокусе. Единственный объект, который всегда получает (хотя бы всплывающие) события клавиатуры (в частности) — stage. Вот почему самой популярной практикой является прослушивание клавиатуры именно на нем.

XpM 28.05.2013 14:50

Спасибо большое. Буду читать далее. Судя по тому, что я уже на ~250 странице обратился к вам, то я еще зайду))

Zebestov 28.05.2013 14:58

Заходи, разбирайся, спрашивай ) для того форум и существует.


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

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