0

AS3プロジェクトとしてFlashDevelopで100%実行される新しいプロジェクトを開始しています。明確にするために、私はAdobeFlashでFLAを作成していません。AdobeFlashは使用されません。

AS3プロジェクトのドキュメントクラスでは、個別の.asクラスファイルに設定されているムービークリップを作成して参照する必要があります。ドキュメントクラスには、キーボードの押下を監視し、必要に応じてムービークリップを移動するイベントリスナーが含まれます。ムービークリップがセットアップされ、ドキュメントクラスからステージに追加されると、キーボード入力を介した移動が正常に機能します。ただし、ムービークリップを別のクラスから設定すると問題が発生します。

私が取り組んでいるプロジェクトとは別に、このStackOverflowの質問に対して3つのテストを実行するサンプルプロジェクトを作成しました。このサンプルプロジェクトには、Main.as(ドキュメントクラス)、createSquare.as(正方形のMCを作成)、およびcreateCircle.as(円のMCを作成)の3つのファイルがすべて同じフォルダーに格納されています。

テスト#1(青い長方形):Main.asで、charRectangleという新しいMCを作成します。サイズ、寸法、色などをここで定義し、ステージに追加します。関数keyIsDown()を実行すると、青い長方形がステージ上で正しく左または右に移動します。これは成功したテストです。

テスト#2(緑の四角):次に、別のクラスファイルからムービークリップを作成することをテストします。Main.asで、charSquareという新しい変数を作成し、それを新しいcreateSquare()として定義します。createSquare.asは特性を定義し、子をステージに追加します。問題:プロジェクトをテストすると、ステージに緑色の正方形が表示されません。ただし、トレース出力は、左矢印キーと右矢印キーが実際にcharSquareのX位置を更新していることを示しています。ムービークリップショーを作成するにはどうすればよいですか?それに対する私の解決策は...

テスト#3(黄色の円):黄色の円についても、緑色の正方形に対して行ったのと同じ方法ですべてを開始します。これをcharCircleと名付けます。Main.asで、変数を新しいcharCircle()として定義するときに、「this」という単語をcreateCircle.asの関数に渡します。これにより、関数createCircleに、ステージ上の親MCである「this」に子を追加するように指示します。これで、目に見える形を見ることができます。問題:トレース出力は、左矢印キーと右矢印キーがX位置を更新していることを示していますが、黄色の円は移動しません。このムービークリップを動かすにはどうすればよいですか?

主な目標:Main.asに文字の形のすべての属性を記載することを避け、それを他のクラスファイルに分離したままにします。Main.asでは、新しい変数を作成し、それを新しいcreateSquare()/ createCircle()として定義してから、Main.asのキーボード関数を使用して動きを処理します。後で、keyboardControls.asと呼ばれる4番目のテストクラスでキーボードコントロールを保持します。

これらの問題は、Adobe FlashのFLAから開始し、ドキュメントクラスを記述し、ステージ上でMCシンボルを作成し、インスタンス名を付けてから、FlashDevelopでASファイルを操作するときに解決できます。しかし、繰り返しになりますが、このプロジェクトではAdobe Flash / FLAを省略する必要があるため、これは私が探しているソリューションではありません。FlashDevelopAS3で100%動的に作成する必要があります。

ありとあらゆる支援に感謝します。3つのテストファイルのソースコードを以下に示します。

Main.as

package {
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.KeyboardEvent;

    public class Main extends MovieClip {

        private var charRectangle:MovieClip;
        private var charSquare:createSquare;
        private var charCircle:createCircle;

        public function Main() {

            trace("Function: Main() has started.");

            // Create rectangle character right here
            charRectangle = new MovieClip();
            charRectangle.graphics.beginFill(0x0000FF);
            charRectangle.graphics.drawRect(200,20,250,100);
            charRectangle.graphics.endFill();
            stage.addChild(charRectangle);

            // Create square character from class
            charSquare = new createSquare();

            // Create square character from class
            charCircle = new createCircle(this);

            // Event listener for user input
            stage.addEventListener(KeyboardEvent.KEY_DOWN,keyIsDown);
        }

        private function keyIsDown(e:KeyboardEvent):void {
            // Left arrow key actions
            if (e.keyCode == 37) {
                charRectangle.x -= 5;
                charSquare.x -= 5;
                charCircle.x -= 5;
            }
            // Right arrow key actions
            if (e.keyCode == 39) {
                charRectangle.x += 5;
                charSquare.x += 5;
                charCircle.x += 5;
            }
            trace("charRectangle.x = " + charRectangle.x + ", charSquare.x = " + charSquare.x + ", charCircle.x = " + charCircle.x);
        }

    }

}

createSquare.as

package {

    import flash.display.MovieClip;

    public class createSquare extends MovieClip {

        private var square:MovieClip;

        public function createSquare() {

            trace("Function: createSquare() has started.");

            square = new MovieClip();
            square.graphics.beginFill(0xFF0000);
            square.graphics.drawRect(200,140,100,100);
            square.graphics.endFill();
            addChild(square);

        }

    }

}

createCircle.as

package {

    import flash.display.MovieClip;

    public class createCircle extends MovieClip {

        private var circle:MovieClip;

        public function createCircle(parentMC:MovieClip) {

            trace("Function: createCircle() has started.");

            circle = new MovieClip();
            circle.graphics.beginFill(0x00FF00);
            circle.graphics.drawCircle(200,350,75);
            circle.graphics.endFill();
            parentMC.addChild(circle);

        }
    }

}
4

1 に答える 1

1

操作された表示オブジェクト(addChild / removeChild / nesting / etc。)に慣れるには、actionscriptの表示リストをもっといじる必要があると思います。

作成charRectangleしてステージに追加すると、それを見ることができます。あなたcharCircleはそのように初期化します

charCircle = new createCircle(this);

内部的にそれをMain(コンストラクターで渡される)に追加すると、上記の両方のクリップも表示されます。これは、作成する場合ではcharSquareありません(したがって、トレースで確認できるようにアクセスできます)が、表示リストに追加することはありません。これを試して:

// Create square character from class
charSquare = new createSquare();
// add it to the display list
addChild(charSquare)

また、すべてのクリップを一度に移動したいとおっしゃいました。これは、3つすべてを別々のSprite/MovieClipにネストするだけで実行できます。

package {
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    public class Main extends MovieClip {

        private var char:Sprite;

        public function Main() {

            trace("Function: Main() has started.");

            char = new Sprite();
            addChild(char);

            // Create rectangle character right here
            var charRectangle:MovieClip = new MovieClip();
            charRectangle.graphics.beginFill(0x0000FF);
            charRectangle.graphics.drawRect(200,20,250,100);
            charRectangle.graphics.endFill();
            char.addChild(charRectangle);

            // Create square character from class
            var charSquare:MovieClip = new createSquare();
            char.addChild(charSquare);
            // Create square character from class
            charCircle = new createCircle(char);

            // Event listener for user input
            stage.addEventListener(KeyboardEvent.KEY_DOWN,keyIsDown);
        }

        private function keyIsDown(e:KeyboardEvent):void {
            if(e.keyCode == Keyboard.LEFT)  char.x -= 5;
            if(e.keyCode == Keyboard.RIGHT) char.x += 5;
            trace("char position",char.x,char.y);
        }

    }

}

(上記のコードはテストしていないため、構文エラーが発生する可能性がありますが、アイデアを明確に示す必要があります)。

他の2つのサイドノート:

  1. MovieClipは、 Spriteのような単純なクラスよりも遅い動的クラスです。タイムラインを使用している場合(およびプロジェクトがそのように見えない場合)を除いて、代わりにSpriteを使用することをお勧めします。単純なプロジェクトの場合、パフォーマンスに大きな影響を与えることはありませんが、長期的には(より複雑なプロジェクトの場合)、リソースを節約する方が安全です。
  2. createCircleクラスとcreateSquareクラスは変更され、より複雑になると思いますが、現在の状態を維持する場合は、さらに単純になる可能性があります。

    パッケージ {

    import flash.display.Sprite;
    
    public class Square extends Sprite {
    
    
        public function Square() {
    
            trace(this);
    
            graphics.beginFill(0xFF0000);
            graphics.drawRect(200,140,100,100);
            graphics.endFill();
    
        }
    
    }
    

    }

createSquareまたはcreateCircleに要素をネストする必要がない場合は、Spriteの方が柔軟性が高いと思われるかもしれませんが、非常に基本的なShapeを使用できます。また、クラスにSquareという名前を付けたことにも注意してください。クラス名は大文字(Sprite / MovieClipなど)で開始し、プロパティとメソッドは小文字(x / alphaなど)で開始し、定数はすべて大文字(KEY_DOWN、CLICKなど)で始めるのが慣例です。など)など)。この規則により、createSquareはクラスというよりも関数名のように聞こえます。規則に従う義務はありませんが、将来、他の人があなたのコードを簡単にスキャンできるようになる可能性があります。主なアイデアは一貫性を保つことです。

于 2012-09-21T10:55:28.770 に答える