Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как объяснить двойное срабатывание события (MouseEvent) ? (http://www.flasher.ru/forum/showthread.php?t=205104)

Wolsh 19.11.2013 13:47

Артём, у стейджа нет прозрачности (IllegalOperationError)))))
Слушать стейдж совершенно нормально, он же плеер.
Ненормально отправлять детей в открытый космос в неизвестность на стейдж.

zCHESNOKz 19.11.2013 13:53

Цитата:

Сообщение от Psycho Tiger (Сообщение 1152964)
Нет, подписываться на stage – вполне нормальная тема. У тебя есть ссылка на какой-то объект, так почему бы не послушать, что он там вещает?
Плохая затея что-то со stage делать – например, класть туда детей (addChild), или менять не знаю, прозрачность? ) Скорее всего об этом и говорил Wolsh.

По хорошему, вообщем-то, вынести всю клавиатурную логику в отдельное место, в отдельный класс, который будет вещать уже всем желающим о клавиатуре. Клавиатура у пользователя одна, так что вполне уместно сделать класс полностью из статичных полей – и ссылок тянуть не надо.
Почему это по хорошему? Ну, скажем, в будущем обнаружится, что если кнопку давить – то события начинают спамиться о том что кнопку быстро-быстро нажимают. Обычно этот эффект нежелателен, и в случае с отдельным классом вставить фикс придется только в этом одном месте.

мой кейменеджер
Код AS3:

package
{
        import flash.display.Stage;
        import flash.events.KeyboardEvent;
 
        public class KeyboardManager
        {
                static private var keys:Array = [];
 
                static public function init(_stage:Stage):void
                {
                        _stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
                        _stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpHandler);
                }
 
                protected static function onKeyUpHandler(event:KeyboardEvent):void
                {
                        keys[event.keyCode] = false;
                }
 
                protected static function onKeyDownHandler(event:KeyboardEvent):void
                {
                        keys[event.keyCode] = true;
                }
 
                static public function isKeyDown($keyCode:int):Boolean
                {
                        return keys[$keyCode];
                }
        }
}

Выходит класс меню будет выглядеть так ?
Код AS3:

package Menu
{
        public class GameMenu extends Sprite
        {
                public var icon:_iconLevel;
 
                public function GameMenu()
                {
                        this.addEventListener(Event.ADDED_TO_STAGE, onAddStage);
                }
 
                protected function onAddStage(event:Event):void
                {
                        this.removeEventListener(Event.ADDED_TO_STAGE, onAddStage);
 
                        icon = new _iconLevel();
                        stage.addChild(icon);
 
                        addListener();
                }
 
                public function addListener():void
                {
                        icon.addEventListener(MouseEvent.MOUSE_DOWN, onClick);
                }
 
                public function onClick(event:MouseEvent):void
                {
                        dispatchEvent( new Event("CLICK_ICON"));
                }
 
        }
}


Psycho Tiger 19.11.2013 18:38

Кейменеджер годится.
Только конвенция наименования... Во флеше принято использовать префикс "_" перед приватными переменными, а не параметрами. То есть в init просто stage, а keys как раз _keys. Знак доллара – указание, что метод проксирует зафинализированный. protected для статиков – ну, это... это нужно очень понимать, зачем :) Лучше private.

Про класс меню, как раз таки,
Код AS3:

stage.addChild(icon);

не надо так.

Надо icon положить в себя (в GameMenu). GameMenu же добавится в root тобой же. (это главный класс приложения, обычно его называют Main). А root уже сам флешплеер положит на stage. Получится,
stage -> root -> GameMenu -> icon. Всё логично, от большего-к-меньшему, и никто не ломится куда-то ввысь.
Т.к. stage здесь не нужен, то код можно сжать как-то так:
Код AS3:

package Menu
{
        public class GameMenu extends Sprite
        {
                public var icon:_iconLevel; //классы лучше называть с большой буквы, без подчеркивания вначале
 
                public function GameMenu(){
                        icon = new _iconLevel();
                        addChild(icon);
                        icon.addEventListener(MouseEvent.MOUSE_DOWN, onClick);
                }
 
                public function onClick(event:MouseEvent):void{
                        dispatchEvent( new Event("CLICK_ICON"));
                }
 
        }
}



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

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