从.as文件添加到ActionScript 3中的Stage

时间:2013-02-05 14:21:21

标签: actionscript-3 sprite stage addchild displayobject

注意:是的,我知道以前曾提出过类似的问题。但是,在按照这些问题的答案后,我仍然卡住了,无法找到解决问题的方法。

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

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 个答案:

答案 0 :(得分: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);
        }
    }
}

答案 1 :(得分:1)

您没有实例化Stage类,如错误所示。就像你无法实例化DisplayObject类一样(这就是为什么你必须扩展Sprite)。

基本上,你有两个选择:

1)您从DisplayObjectContainer实例添加孩子。

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

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

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

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

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

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

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

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

答案 2 :(得分:0)

好吧,我认为实例化一个阶段类是不行的,因为as3文档说:“Stage对象不是全局可访问的。你需要通过DisplayObject实例的stage属性访问它。”

您应该将Stage对象的引用传递给您的Displayer类,并且您可以通过显示对象实例获得对舞台对象的引用,如文档所述。

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

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

假设实例化您的显示器的对象是舞台的孩子,您可以通过

实例化显示器
displayer = new Displayer( stage );

如果使用这种方法,则无需使用Displayer类扩展任何内容或将其添加到舞台中(这在bitmapdata.com的方法中是必需的。)

答案 3 :(得分: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");

就这么简单。我想这就是你要寻找的......祝你好运。 (你可以通过任何容器或parant容器这个或这个阶段。它不会影响你的孩子。