flash as3 - этап доступа вне класса документа - PullRequest
1 голос
/ 24 июня 2011

Я пытаюсь добавить слушатель событий клавиатуры на сцену, чтобы определить, когда пользователь нажимает клавиши со стрелками влево или вправо. Но этот слушатель вызывается из файла класса, который импортируется в класс документа, поэтому я думаю, что он не знает, что означает «этап». Как мне это решить?

Это мой код:

Класс документа: AugmentedReality.as:

package {
  import examples.PlaneVid_Carousel;

  public function AugmentedReality(){
    addChild (new PlaneVid_Carousel())
  }
}

PlaneVid_Carousel.as {

  package examples {
    import flash.display.*;
    import flash.events.*;

    public class PlaneVid_Carousel extends Sprite {

      public function PlaneVid_Carousel(){
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown
      }

      protected function keyPressedDown(e:KeyboardEvent):void {
        //DO STUFF
      }

    }

  }
}

Ответы [ 2 ]

2 голосов
/ 24 июня 2011

Добавьте слушателя клавиатуры после того, как PlaneVid_Carousel был добавлен на сцену, тогда сцена будет доступна.

public function PlaneVid_Carousel() 
{
    if (stage) init();
    else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void 
{
    removeEventListener(Event.ADDED_TO_STAGE, init);

    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown);
}

protected function keyPressedDown(e:KeyboardEvent):void 
{
    //DO STUFF
}

Я всегда использую этот метод init для моих объектов DisplayObject, и это шаблон по умолчанию дляDisplayObject для FlashDevelop.

0 голосов
/ 24 июня 2011

Легким решением было бы добавить статическое свойство в класс документа, который для этого примера называется MyApp.as.Вы присваиваете значение свойству globalStage, устанавливая его в достойный момент времени, который в большинстве случаев в классе документа может быть конструктором:

public class MyApp extends Sprite {
    public static var globalStage:Stage;
    //...

    public function MyApp() {
        globalStage = stage;
    }
}

После этого вы можете получить доступ к сцене из любого места,импортируя класс документа и вызывая этот фрагмент:

MyApp.globalStage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);

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

public function MyApp() {
    StageProxy.stage = stage;
}

И получить к нему доступ из любого места:

StageProxy.stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);

Это все равно не то, что я бы назвал «чистым» или «красивым», ноон выполняет свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...