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

InMainクラスの外部クラスをステージで初期化しようとしました。実際、ステージは到着していません。_class_BGを参照してください。addChild()は少し間違っています。メインクラスをチェックしていないので、ステージが完全に追加されました。

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);
    }

メイン (ステージにアクセスできる) では:

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

ロジックを構築するための他の方法を検討する必要があります。しかし、それはうまくいくはずです。

編集:

ステージ -> myStage; また、Main() に addChild を追加します。

于 2013-02-21T16:29:00.950 に答える