Мои события клавиатуры не срабатывают после того, как я прикину сцену к классу меню - PullRequest
0 голосов
/ 28 марта 2011

У меня проблема с этим уроком меню, которому я следовал с ASGamer .Я сделал и использовал большинство, если не все учебники с этого сайта.

В любом случае, моя проблема в их базовом классе меню;

package com.game.scripts.menu
{
    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.events.Event;

    import com.caurina.transitions.Tweener;

    public class BaseMenu extends MovieClip
    {
        public var stageRef:Stage;
        public var loadNext:BaseMenu;

        public function BaseMenu()
        {
            alpha = 0;
        }

        public function Unload(loadMe:BaseMenu = null):void
        {
            if(loadMe != null)
            {
                loadNext = loadMe;
            }

            Tweener.addTween(this, {alpha:0, time:0.7, onComplete:Remove});
        }

        public function Remove():void
        {
            //dispatchEvent(new Event("menuRemoved"));
            if(stageRef.contains(this))
            {
                stageRef.removeChild(this);
            }

            if(loadNext != null)
            {
                loadNext.Load();
            }
        }

        public function Load():void
        {
            stageRef.addChild(this);
            Tweener.addTween(this, {alpha:1, time:0.7});
        }
    }
}

Всякий раз, когда я использую функцию Remove (),который также используется функцией Unload (), мой stage.addEventListeners ломается.В частности, мой stage.addEventListener (KeyboardEvent.KEY_UP, KeyUpHandler) в другом классе вообще не выполняется.

Есть ли другой способ удалить меню, не выходя из сцены?Или, если вы знаете лучший учебник меню, ссылка будет очень полезна: D

EDIT Я только что прокомментировал все в функции Remove (), и обработчик клавиш все еще не работает.

РЕДАКТИРОВАНИЕ 2 Первое редактирование применимо только к моему MainMenu, остальные мои меню выглядят нормально.Я прокомментировал эту часть;

if(stageRef.contains(this))
{
    stageRef.removeChild(this);
}

, и мой KeyUpHandler работает нормально.Поэтому я предполагаю, что flash не удалит для меня мувиклипы, или все будет в порядке, и он будет удален?

Ответы [ 2 ]

0 голосов
/ 29 марта 2011

РЕДАКТИРОВАТЬ: если подумать, вам не нужно этого делать, если ваше BaseMenu является производным от спрайта или MovieClip, я вполне уверен. поэтому просто измените stageRef.removeChild () на stage.removeChild ()

ваш stageRef на самом деле не указывает на реальную сцену. (вроде)

Также вы должны попытаться привыкнуть к использованию событий ADDED_TO_STAGE.

package src 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class MainDocument extends Sprite
    {
        private var myMenus:BaseMenu;

        public function MainDocument() 
        {
            addEventListener(Event.ADDED_TO_STAGE, initMain);
        }

        private function initMain(e:Event):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, initMain);

            myMenus = new BaseMenu();
            addChild(myMenus);
        }

    }

}

package src 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class BaseMenu extends Sprite
    {
        public function BaseMenu() 
        {
            addEventListener(Event.ADDED_TO_STAGE, initBanseMenu);
        }

        private function initBanseMenu(e:Event):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, initBanseMenu);

            trace(stage.stageHeight);
        }

    }

}

Как видно из трассировки, сцена доступна без ссылки.

Это также должно работать нормально. (фактически этап - это «этап», а не «этап», поэтому обязательно отправьте «этап» в конструктор BaseMenu.

public var stageRef:Stage;

public function BaseMenu(stageRef:Stage)
{
    this.stageRef = stageRef;
    alpha = 0;
}

Хорошо, здесь вы можете поместить эти файлы в проект flashdevelop или что вы используете и протестировать его; -).

package src 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    public class MainDocument extends Sprite
    {
        public var myMenuTest:BaseMenu;
        public var mySubMenuTest:SubMenu; 

        public function MainDocument() 
        {
            addEventListener(Event.ADDED_TO_STAGE, initMain);
        }

        private function initMain(e:Event):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, initMain);

            myMenuTest = new BaseMenu(stage);
            myMenuTest.x = stage.stageWidth / 2;
            myMenuTest.y = stage.stageHeight / 2;
            //myMenuTest.Load(); // we can load our Main menu now if we want.

            mySubMenuTest = new SubMenu(stage);
            mySubMenuTest.x = 100;
            mySubMenuTest.y = 100;

            stage.addEventListener(KeyboardEvent.KEY_UP, handleKeyUp);
        }

        // for testing purposes.
        private function handleKeyUp(e:KeyboardEvent):void 
        {
            if (e.keyCode == Keyboard.UP)
                myMenuTest.Unload(mySubMenuTest);
            else if (e.keyCode == Keyboard.DOWN)
                mySubMenuTest.Unload(myMenuTest);
            else
                trace(e.keyCode);
        }
    }
}

package src 
{
    import flash.display.Sprite;
    import flash.display.Stage;

    public class BaseMenu extends Sprite
    {
        public var stageRef:Stage;
        public var loadNext:BaseMenu;

        public function BaseMenu(stageRef:Stage) 
        {
            this.stageRef = stageRef;
        }

        public function Unload(loadMe:BaseMenu = null):void
        {
            if (loadMe != null)
            {
                loadNext = loadMe;
            }
            Remove(); // add your tween.
        }

        public function Load():void
        {
            // this is just so we can have something to see for the test.
            drawTest();
            stageRef.addChild(this);
            // add your tween
        }

        public function Remove():void
        {
            if (stageRef.contains(this))
                stageRef.removeChild(this);

            if (loadNext != null)
                loadNext.Load();
        }

        protected function drawTest():void
        {
            graphics.clear();
            graphics.lineStyle(1, 0);
            graphics.beginFill(0xccccff);
            graphics.drawCircle(0, 0, 20);
            graphics.endFill();
        }
    }
}

package src 
{
    import flash.display.Stage;

    public class SubMenu extends BaseMenu
    {
        public function SubMenu(stageRef:Stage) 
        {
            super(stageRef);
        }
    }
}

Это должно объяснить, как я имел в виду. Чтобы протестировать эту программу, просто загрузите ее в режиме отладки и используйте клавиши со стрелками вверх или вниз для переключения между двумя классами меню. нажатие любой другой клавиши вне зависимости от того, какое меню находится, приведет к тому, что код клавиши станет стандартным. (отладочное окно вывода). Очевидно, 1 класс на файл. Надеюсь, это прояснит ситуацию.

0 голосов
/ 29 марта 2011

Я могу только догадываться, что Sprite, который вы предоставляете классу меню для stageRef, не имеет ссылки после вызова remove и поэтому собирает мусор, поэтому вы больше не получаете никаких ключевых событий.

Twoпредложения:

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