Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash CS5引用非文档类构造函数中的显示对象_Flash_Actionscript 3_Flash Cs5 - Fatal编程技术网

Flash CS5引用非文档类构造函数中的显示对象

Flash CS5引用非文档类构造函数中的显示对象,flash,actionscript-3,flash-cs5,Flash,Actionscript 3,Flash Cs5,在学习了访问FlashCS5中放置在舞台上的对象(而不是document类(found))的这种优秀方法之后,我遇到了一个障碍。我正在使用 this.stage.getChildAt(0).greenLight1.visible=false; 在访问greenLight1(位图的my.fla中指定的实例名称)时,将实例名为greenLight1的符号变为不可见。这在我使用它的地方非常有效,它位于几个不同类的子函数中。我遇到的问题是,您不能在这些非文档类的构造函数中使用它,也不能在构造函数直接调

在学习了访问FlashCS5中放置在舞台上的对象(而不是document类(found))的这种优秀方法之后,我遇到了一个障碍。我正在使用

this.stage.getChildAt(0).greenLight1.visible=false;
在访问greenLight1(位图的my.fla中指定的实例名称)时,将实例名为greenLight1的符号变为不可见。这在我使用它的地方非常有效,它位于几个不同类的子函数中。我遇到的问题是,您不能在这些非文档类的构造函数中使用它,也不能在构造函数直接调用的任何函数中使用它。如果我尝试这样做,我会得到以下“错误#1009:无法访问空对象引用的属性或方法。”

所以我觉得我没有正确地理解这句话,开始玩这个短语。当我切换到

this.getChildAt(0).greenLight1.visible=false;
我得到了一个不同的错误“1119:通过静态类型flash.display:DisplayObject的引用访问可能未定义的属性greenLight1”。所以我显然在这里遗漏了一些东西

现在我尝试了一种不同的策略,我在上面的线程链接中也提到了这一点。多亏了Allan在我的另一篇文章中的评论,我的方法才真正起作用。然而,当我试图将该引用放入任何其他非文档类的构造函数类时,我实际上得到了相同的“Error#1009:无法访问null对象引用的属性或方法”。但是如果我在子函数中使用它,它就可以正常工作。看来也是同样的问题

我的项目由一个Game.fla文件组成,该文件包含各种位图符号和几个按钮,我将这些按钮放入我的库中并拖到舞台上(我给了它们所有唯一的实例名)。我已经设置了我的文档类Game.as,在它里面,我可以使用它们的实例名访问所有这些项目。现在,在名为Player.as的子类中,我设置了一个名为lightsOut()的函数,该函数使用开关/外壳关闭灯光。就是在这里,我使用了“this.stage.getChildAt(0.greenLight1.visible=false”;它工作得非常好。这也是我设置上述不同策略的地方,并尝试了“Game.GL1.visible=false”;这也非常有效。但在我的名为Controller.as的子类中,我有我所有的鼠标和键盘处理程序,我试图为我的一个stage按钮设置一个事件侦听器。因此,我将它放在控制器构造函数中,在那里我设置了所有其他事件侦听器并已开始工作(它们使用“stage.addeventlistener…”),正是在这里我开始看到错误。所以我想我应该试着关掉绿灯1,因为我已经知道代码正在工作,并且尝试了“this.stage.getChildAt…”行和“Game.GL1…”行,只是为了观察它们导致我上面提到的错误。所以我回到了我的Player.as类,并在它的Player构造函数类中尝试了它们,并且再次得到了相同的错误,尽管我在Player.as类中使用了相同的行。请注意,我已经将这个阶段传递给了控制器和播放器,并且在这两个方面都很好地使用了它。我还尝试在构造函数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;
        }
    }
我错过了什么

编辑: 好的,这是文档类(至少对控制器和播放器很重要):

下面是Controller类的重要部分,我对失败之处添加了一条注释(这是我开始撰写本文的真正原因):


我添加的最后一行只是想看看是否可以让greenLight1变得不可见,就像我在Player.as中提到的lightsOut()函数中调用它一样。但是当把它放在构造函数中时,它也不起作用。救命啊!!!!lol

事实上,您不能访问类构造函数中stage上的实例,但可以访问类的另一个函数(我假设您稍后调用)中的实例,这使我认为在调用stage时,构造函数无法使用该stage

检查以确保您的Game.as document类设置如下,尽管可能是因为您遵循了我的方法:

public function Game() {
    addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
    //DO NOT CREATE CLASS INSTANCES IN HERE
}

private function init(e:Event):void{
    //In here is where we create instances of classes
}

此外,在玩家类的构造函数参数中,将阶段数据类型设置为
stage
,而不是
Object
,以获得良好的编码实践。

stage
DisplayObject
的属性,只有在添加到
DisplayList
(即-通过
addChild()
添加到某物)

除非是document类,否则从类构造函数访问
stage
不会有任何运气

如前所述,您可以将构造函数的内容转移到一个自定义函数,该函数在触发
事件后被调用。已将添加到\u STAGE

例如,这里有一个演示类:

public class Thing extends DisplayObject
{
    /**
     * Constructor
     */
    public function Thing()
    {
        // Add listener
        addEventListener(Event.ADDED_TO_STAGE, _added);
    }

    /**
     * Called once this has been added to the display list
     * @param e Event.ADDED_TO_STAGE
     */
    private function _added(e:Event):void
    {
        // Discard listener
        removeEventListener(Event.ADDED_TO_STAGE, _added);

        // My initial code
        trace(stage + " is accessible");
    }
}
然后,我们将创建以下内容的实例:

var thing:Thing = new Thing(); // nothing happens
然后添加到阶段/当前容器:

addChild(thing); // output: [Object Stage] is accessible
至于访问
greenLight1
,这应该可以通过以下任一方式轻松实现:

stage.greenLight1;
stage["greenLight1"];
此外,您可能要替换:

public function Player(stage:Object):void
与:


您遇到的问题是,在将阶段对象传递给控制器类之前,您正在实例化控制器类。必须等到触发
ADDED_to_stage
事件之后,才能实例化其他所有内容:

public class Game extends MovieClip {
    private var _player:Player;
    private var _controller:Controller;

    public function Game():void
    {
        addEventListener(Event.ADDED_TO_STAGE, added);
    }
    private function added(evt:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, added);
        _player = new Player(stage);
        _controller = new Controller(_player,stage);
        addChild(_player);
    }
}
有更好的方法

您不需要将stage Through传递给播放机和控制器。如果您只传递对
this
的引用,您将传递对document类的引用。T
public function Player(stage:Object):void
public function Player(stage:Stage):void
public class Game extends MovieClip {
    private var _player:Player;
    private var _controller:Controller;

    public function Game():void
    {
        addEventListener(Event.ADDED_TO_STAGE, added);
    }
    private function added(evt:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, added);
        _player = new Player(stage);
        _controller = new Controller(_player,stage);
        addChild(_player);
    }
}
public class Game extends MovieClip {
    private var _player:Player;
    private var _controller:Controller;

    public function Game():void
    {
        addEventListener(Event.ADDED_TO_STAGE, added);
    }
    private function added(evt:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, added);
        _player = new Player(this);
        _controller = new Controller(_player,this);
        addChild(_player);
    }
}
public class Player extends MovieClip {
    private var docRef:Game;
    private var _lights:uint;

    public function Player($docRef:Game):void {
        this.docRef = $docRef;
        docRef.greenLight1.visible=false; //no longer needs to wait for player to be on the stage
    }
}
docRef.stage.addEventListener ...