0

(AS3/Flash 的新手,所以如果我对某事一无所知,请放轻松...)

尝试利用外部类文件创建连续滚动的背景图像。我通过将它放在文档类文件中来让它工作,但是尝试将它放在它自己的外部类文件中并从文档类文件中调用它会导致我的标题中出现错误。

文档类文件:

package {

    import flash.display.MovieClip; 
    import org.masteringmoneybasics.piggy._class_BG



    public class Main extends MovieClip {
        public function Main() {
            //Create instance of background class
            new _class_BG();
            } 

    }
}

外部类文件:

package org.masteringmoneybasics.piggy {

    import flash.display.*
    import flash.events.Event
    import flash.display.Bitmap;
    import flash.display.BitmapData;

    public class _class_BG{
        //BG Variables
        var scrollSpeed:uint = 6;
        var bgLeft:Bitmap
        var bgRight:Bitmap

        [Embed(source="../../../assets/side_of_mountain.png")]
            private var bgImage:Class;

        public function _class_BG() {
                    //This adds two instances of the background to the stage
            bgLeft = new bgImage();
            bgRight = new bgImage();
            bgLeft.height = 500;
            bgRight.height = bgLeft.height;
            bgLeft.width = 1300;
            bgRight.width = bgLeft.width;
            bgLeft.x = 0;
            bgRight.x = bgLeft.width;
            addChild(bgLeft);
            addChild(bgRight);

            //Adds an event lsitener to the stage
            stage.addEventListener(Event.ENTER_FRAME, moveScroll); //<<<<<< ERROR HERE
        }

        public function moveScroll(e:Event):void{
            bgLeft.x -= scrollSpeed;
            bgRight.x -= scrollSpeed;

            if(bgLeft.x < -bgLeft.width){
                bgLeft.x = bgRight.x + bgRight.width;
            }else if(bgRight.x < -bgRight.width){
                bgRight.x = bgLeft.x + bgLeft.width;
            }
        }

    }

}

如果我移除舞台。在事件侦听器中引用,它运行没有错误,但图像不会像他们应该的那样出现在舞台上。

我究竟做错了什么?

4

2 回答 2

0

您试图在主类外部类中初始化阶段。事实上,阶段还没有到来。看到你的 _class_BG,addChild() 有点不对。因为您没有检查 Main 类,所以完美添加了阶段。

FlashBuilder这个问题一定要小心。在外部类(相关的 DisplayObject)完全加载或初始化后首先添加到 Main 类的阶段。

参考以下代码。

在_class_BG 上课认真addEventListener(Event.ADDED_TO_STAGE,init);

package {

    import flash.display.MovieClip; 

        public class Main extends MovieClip {
            public function Main() {
                var sp:_class_BG = new _class_BG();
                addChild(sp);
            }   
        }
}

package {

    import flash.display.*;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.events.Event;

    public class _class_BG extends Sprite {
        //BG Variables
        private var scrollSpeed:uint = 6;
        private var bgLeft:Bitmap
        private var bgRight:Bitmap

        [Embed(source="../asset/myTestImage.png")]
        private var bgImage:Class;

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

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

            //This adds two instances of the background to the stage
            bgLeft = new bgImage();
            bgRight = new bgImage();
            bgLeft.height = 500;
            bgRight.height = bgLeft.height;
            bgLeft.width = 1300;
            bgRight.width = bgLeft.width;
            bgLeft.x = 0;
            bgRight.x = bgLeft.width;
            addChild(bgLeft);
            addChild(bgRight);

            //Adds an event lsitener to the stage
            stage.addEventListener(Event.ENTER_FRAME, moveScroll);
        }

        public function moveScroll(e:Event):void{
            bgLeft.x -= scrollSpeed;
            bgRight.x -= scrollSpeed;

            if(bgLeft.x < -bgLeft.width){
                bgLeft.x = bgRight.x + bgRight.width;
            }else if(bgRight.x < -bgRight.width){
                bgRight.x = bgLeft.x + bgLeft.width;
            }
        }

    }

}
于 2013-02-21T16:41:06.403 回答
0

只有顶层 Displayable 可以访问场景。更重要的是,它是只读的,这意味着您不能通过原始阶段属性传递它。

最简单的方法是......我不知道,也许将阶段传递给您的构造函数?构造函数的相关部分是:

    public function _class_BG(myStage : Stage) {

        // SNIP

        //Adds an event lsitener to the stage
        myStage.addEventListener(Event.ENTER_FRAME, moveScroll);
    }

在 Main 中(您可以在其中访问舞台):

public class Main extends MovieClip {
    public function Main() {
        //Create instance of background class
        addChild(new _class_BG(stage));
    } 
}

您应该考虑一些其他构建逻辑的方法,通过舞台会很快变得毛茸茸。但它应该工作。

编辑:

舞台->我的舞台;另外,在 Main() 中添加孩子。

于 2013-02-21T16:29:00.950 回答