0

注意:是的,我知道以前有人问过类似的问题。但是,在遵循此类问题的答案后,我仍然陷入困境,无法找到解决问题的方法。

我遇到了一个问题,需要将 DisplayObjects 添加到 Flash 阶段。由于我必须显示几个不同类的元素,我决定创建一个类作为 .as 文件和addChild名为“Displayer”的函数之间的中介,如下所示:

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

    public class Displayer extends Sprite //I read somewhere that DisplayObject
//as an extension can't be used for this, so Sprite will have to do.
    {
        private var _stage:Stage;

        function Displayer()
        {
            _stage = new Stage;
        }

        public function displayElement(displayable:DisplayObject)
        {
            _stage.addChild(displayable);
        }
    }
}

我编译它,出现了一个我不明白的问题:错误 #2012:无法实例化 Stage 类。显然,此代码中的某些内容要么丢失,要么不合适,但由于它非常简单,我看不出问题出在哪里。我确信这不是很复杂,我可能只是需要一个局外人的观点。

4

4 回答 4

4

Stage 对象不可全局访问。您需要通过 DisplayObject 实例的 stage 属性来访问它。

请参阅以下文档。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Stage.html

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

    public class Displayer extends Sprite
    {
        var isAddedToStage:Boolean;

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

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

        public function displayElement(displayable:DisplayObject):void
        {
            if(isAddedToStage)
              this.stage.addChild(displayable);
        }
    }
}
于 2013-02-05T14:46:18.333 回答
1

Stage正如错误所说,您没有实例化该类。就像您无法实例化DisplayObject该类一样(这就是您必须扩展的原因Sprite)。

基本上,您有两种选择:

DisplayObjectContainer1)您从一个实例添加孩子。

var displayerInstance:Displayer = new Displayer();
this.addChild( displayerInstance );

您将从已添加到全局舞台的 DisplayObjectContainer 对象运行它。每个项目中只有一个stage,即使你嵌入了SWF,SWF的stage属性实际上是顶级应用程序的stage属性。因此,如果您将此Displayer实例嵌套在一个嵌套在主应用程序中创建的另一个类中的类中,则必须在每个这些类中运行“addChild”Displayer才能显示。

2)你作弊。完全不建议这样。基本上,您在实例化Displayer类时传入对象的阶段对象。

var displayerInstance:Displayer = new Displayer( this.stage );
public function Displayer( stage:Stage ) {
    this.stage = stage;

    if ( this.stage ) {
        this.stage.addChild( this );
    }
}

这是一种非常适合将单例添加到舞台的方法(除非没有单例的构造函数)。我在圣诞节前创建了一个分析器,它是一个 Singleton(后来发现 Scout,该死的),它使用这种方法在适当的时候向舞台添加东西。

同样,不建议在这种情况下使用第二种选择,但这是可能的。

顺便说一句,除非有明确的理由(例如弹出窗口),否则您永远不应该直接向 中添加内容。Stage您应该遵循显示列表方法,其中 DisplayObjectContainer 添加另一个 DisplayObject 或 DisplayObject 容器作为子容器,依此类推,以使它们都连接到 TopLevelApplication。

于 2013-02-05T16:20:23.073 回答
0

好的,我认为实例化舞台类是行不通的,因为 as3 文档说:“舞台对象不可全局访问。您需要通过 DisplayObject 实例的舞台属性访问它。”

相反,您应该将对 Stage 对象的引用传递给您的 Displayer 类,并且您可以通过显示对象实例获取对舞台对象的引用,正如文档所说的那样。

所以构造函数现在可能看起来像:

function Displayer( stage:Stage )
{
    _stage = stage;
}

假设实例化您的 Displayer 的对象是舞台的子级,您可以通过以下方式实例化 Displayer

displayer = new Displayer( stage );

如果您使用这种方法,则不需要 Displayer 类扩展任何内容或添加到舞台(顺便说一句,在 bitmapdata.com 的方法中这是必需的)。

于 2013-02-05T14:25:47.330 回答
0

总是有一个简单的解决方案。如果您需要将子元素添加到班级的舞台中,您可以将舞台作为对象传递到班级中并将子元素添加到其中,我这样做是为了将图像添加到我的像这样的舞台。

package {
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.net.URLRequest;
    import flash.display.Bitmap;

    public class ImageLoader extends Sprite{


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

        public function loadeimage(StageObject:Object, Url:String){ //StageObject will bring the stage refarance into the class

            var reQuest:URLRequest = new URLRequest(Url);
            loader.load(reQuest);

            stageObj=StageObject; //make local refarance for stage inside the class

            var image:Bitmap;
            image=Bitmap(loader.content);

            image.x = 100;
            image.y = 100;

            stageObj.addChild(image); // add whatever object into stage refarance and this means the real stage..

        }
    }

}

只有带注释的东西很重要,您可以将此文件保存为 ImageLoader.as 并导入并像这样使用它。

import ImageLoader;

var IL:ImageLoader = new ImageLoader();
IL.loadeimage(this,"img.jpg");

就这么简单。我认为这就是您要搜索的内容...祝您好运。(您可以通过 this 或 this.stage 的任何容器或 parant 容器,您的孩子将成为其中的一部分并不重要。

于 2016-11-19T09:36:13.040 回答