Узнав об этом превосходном методе доступа к объекту, помещенному на сцену в Flash CS5, в классе, отличном от класса документа (найден в этой теме ), я наткнулся на точку преткновения.Я использую
this.stage.getChildAt(0).greenLight1.visible=false;
, чтобы превратить символ с именем экземпляра greenLight1, невидимым при доступе к greenLight1 (имя экземпляра, указанное в моем .fla для растрового изображения).Это прекрасно работает там, где я использовал его, который находится в подфункции нескольких разных классов.Проблема, с которой я сталкиваюсь, заключается в том, что вы не можете использовать это в конструкторе этих недокументированных классов или в любой функции, вызываемой непосредственно конструктором.Если я пытаюсь это сделать, я получаю следующее сообщение об ошибке «Ошибка № 1009: не удается получить доступ к свойству или методу пустой ссылки на объект».
Так что я понимаю, что не получаю доступ к этому правильно, и начинаю игратьс фразой.Когда я переключаю его на
this.getChildAt(0).greenLight1.visible=false;
, я получаю другую ошибку «1119: Доступ к возможно неопределенному свойству greenLight1 через ссылку со статическим типом flash.display: DisplayObject.»Так что я явно чего-то здесь упускаю.
Теперь я попробовал другую тактику, которую я нашел в этой теме , которую я также упомянул в приведенной выше ссылке на тему, которую я настроил.И благодаря комментарию Аллана в моей другой ветке, я фактически заставил этот метод работать.Однако, когда я пытаюсь поместить эту ссылку в класс конструктора любого другого класса, не относящегося к документу, я фактически получаю ту же ошибку «Ошибка № 1009: не удается получить доступ к свойству или методу пустой ссылки на объект».Но это прекрасно работает, если я использую его в подфункции.Похоже, та же проблема.
Мой проект состоит из файла Game.fla, в котором содержатся различные растровые символы и несколько кнопок, которые я поместил в свою библиотеку и перетащил на сцену (и я дал им всеуникальные имена экземпляров).Я настроил свой класс документов Game.as, и внутри него я могу получить доступ ко всем этим элементам, просто используя их имя экземпляра.Теперь в моем подклассе под названием Player.as я настроил функцию lightsOut (), которая выключает свет, используя переключатель / чехол.Именно там я использую "this.stage.getChildAt (0) .greenLight1.visible = false;"и это работает отлично.Здесь я также установил другую тактику, о которой упоминал выше, и попробовал «Game.GL1.visible = false;»и это отлично сработало.Но затем в моем подклассе под названием Controller.as, где у меня есть все мои обработчики мыши и клавиатуры, я попытался настроить прослушиватель событий для одной из моих кнопок этапа.Поэтому я поместил его в функцию конструктора Controller, где все мои другие прослушиватели событий настроены и уже работают (они используют «stage.addeventlistener ...»), и именно здесь я начал видеть ошибки.Так что я решил попытаться отключить greenLight1, так как я уже знал, что код работает, и пробовал только строку «this.stage.getChildAt ....» и только строку «Game.GL1 ...»смотреть их вызывают ошибки, которые я упоминал выше.Поэтому я вернулся к своему классу Player.as и попробовал их в классе конструктора Player, и снова получил те же ошибки, даже если я использую ту же строку ниже в классе Player.as.Обратите внимание, что я прошел стадию и для Controller, и для Player и прекрасно использовал ее в обоих случаях.Я также попытался настроить вызов другой функции в конструкторе с именем Init ();и получил ту же ошибку при попытке получить доступ к greenLight1, но он все еще работал в lightsOut ().Также не уверен, имеет ли это значение, но все классы также расширяют MovieClip.Я не знаю, поможет ли это, но вот начало класса Player вместе с функцией lightsOut. Я удалил оставшуюся часть кода, поскольку она не связана:
package {
import flash.events.Event;
import flash.display.MovieClip;
import flash.display.DisplayObject;
public class Player extends MovieClip {
private var _stage:Object;
private var _lights:uint;
public function Player(stage:Object):void {
this._stage = stage;
this._stage.getChildAt(0).greenLight1.visible=false; //errors
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function lightsOut():void {
switch(_lights) {
case 1:
this._stage.getChildAt(0).greenLight1.visible=false;//works
break;
case 2:
this._stage.getChildAt(0).greenLight2.visible=false;//works
break;
case 3:
this._stage.getChildAt(1).greenLight3.visible=false;//works
break;
}
}
Чего мне не хватаетздесь?
РЕДАКТИРОВАТЬ: ОК, вот класс документа (по крайней мере, что важно для контроллера и проигрывателя):
public class Game extends MovieClip {
private var _player:Player = new Player(stage);
private var _controller:Controller = new Controller(_player, stage);
public function Game():void {
addChild(_player);
addEventListener(Event.ADDED_TO_STAGE, added);
Вот важная часть класса Controller, и я добавил комментарий к тому, что терпит неудачу (реальная причина, по которой я начал этот пост в первую очередь):
public class Controller extends MovieClip {
private var _stage:Stage;
private var _model:Object;
public function Controller(model:Object, stage:Stage):void {
this._model = model;
this._stage = stage;
_stage.addEventListener(KeyboardEvent.KEY_DOWN, processKeyDown);
_stage.addEventListener(KeyboardEvent.KEY_UP, processKeyUp);
_stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
this._stage.getChildAt(0).fireButton.addEventListener(MouseEvent.CLICK, onClick); //this is what isn't working
this._stage.getChildAt(1).greenLight1.visible=false; //added this for testing
Эта последняя строка, которую я только добавил, чтобы увидеть, смогу ли я сделать greenLight1 невидимым, как когда я вызываю его в функции lightsOut (), которую я отметил в Player.as. Но это НЕ работает, когда размещено здесь в конструкторе. ПОМОГИТЕ!!!! лол