Как получить доступ к сцене из класса AS3 в Adobe Flash - PullRequest
5 голосов
/ 22 апреля 2010

Проблема, с которой я столкнулся, состоит в том, что я использую keyboardEventListener, чтобы заставить мувиклип бегать вокруг.Поскольку я являюсь студентом колледжа, я создаю его для задания, но мы вынуждены использовать классы as3.

Когда я запускаю код на основной временной шкале, проблем нет.Но когда я пытаюсь получить доступ к нему из другого класса (с «Экспортом для ActionScript» в рассматриваемом мувиклипе), я получаю сообщение об ошибке, он не может обратиться к сцене.* .addEventListener (KeyboardEvent.KEY_DOWN, dostuff);

Ответы [ 4 ]

9 голосов
/ 22 апреля 2010

Класс в AS3 не находится на сцене, пока вы на самом деле не поместите его туда. В результате «this.stage» будет нулевым во время компиляции. Вы можете обойти эту проблему, используя событие ADDED_TO_STAGE, чтобы отложить привязку ваших слушателей, пока не наступит подходящее время.

public function MyClass(){
    this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}

private function addedToStageHandler(e:Event):void{
    this.stage.addEventListener(KeyboardEvent.KEY_DOWN, dostuff);
}
0 голосов
/ 19 ноября 2016

Когда вы создаете класс, вы должны ссылаться на сцену изнутри вашего класса, потому что он недоступен глобально, вы должны передать его в класс, и вот пример для использования слушателя события стадии внутри класса.

package  {
    import flash.events.KeyboardEvent;

    public class Eventhndl{

        private var obj:Object; //create local variable to refarance stage


        public function Eventhndl(objStage:Object):void{
            obj = objStage; //make local refarance for stage inside the class

            obj.addEventListener(KeyboardEvent.KEY_DOWN,runit); //add the event listener
        }

        private function runit(Event:KeyboardEvent):void{
            trace("keyDownHandler: " + Event.keyCode);
            trace("ctrlKey: " + Event.ctrlKey);
            trace("keyLocation: " + Event.keyLocation);
            trace("shiftKey: " + Event.shiftKey);
            trace("altKey: " + Event.altKey);
        }
    }

}

сохраните файл как Eventhndl.as, и теперь вы можете просто добавить экземпляр этого класса и передать любой объект, который вам нужен для прослушивания его события, вот как это сделать.

import Eventhndl;

var EH:Eventhndl = new Eventhndl(stage); 
0 голосов
/ 27 апреля 2011

этот ответ помог мне миллион раз, но у меня пока недостаточно очков, чтобы его вспомнить, или я бы это сделал.

Это обычно происходит, когда вы пытаетесь получить доступ к чему-либо на сцене, прежде чем это будет добавлено на сцену. Некоторое время я использовал init () в конструкторе основных классов всех моих проектов, но из-за этой проблемы я больше этого не делал. Теперь вместо этого я заменил его следующим (где Main - конструктор / имя класса):

public function Main():void {
    this.addEventListener(Event.ADDED_TO_STAGE, init);
    super();    
}
...
private function init(e:Event):void {
...

Надеюсь, это поможет любому, кто прочитает любую из моих книг на флэш-памяти, которая предлагает идею init ().

И ... спасибо, Грег В.

0 голосов
/ 25 апреля 2010

"1120: доступ к неопределенному свойству Keyboard. Там твой ответ. Вы не определили свойства клавиатуры. Это означает, что вы не импортировали в пакет.

должно выглядеть примерно так:

 import flash.display.*;
 import flash.events.*;
 import flash.ui.*; 

Совет: иметь более глубокий взгляд на импорт. Попробуйте использовать Flash Builder, это гораздо лучше для начинающих и классов автоматического импорта, так что вам не нужно запоминать все.

...