2

そして、タイムライン コードから OOP/ドキュメント クラスに切り替えるという問題が発生しています。AS3 を使用して Fla をスケジュールどおりに問題なくビルドできました。しかし、OOP の場合はまったく無知です。

シーンは良くないと言われていました。シーンをムービークリップとして保存することに固執する必要があります。

私の状況は次のとおりです。8 ページの PSD ファイルがあり、各 PSD を Flash Pro にインポートしました。各 PSD にはいくつかのボタンとテキスト入力があります。最初のページはログインページ、2番目のページは登録ページなどです。

私の質問は次のとおりです。

1.) PSD の保存方法を教えてください。それらをネストされたアニメーションとして保存しますか(PSDの各アイテムにシンボルを与えますか?ボタンとテキスト入力ですか?)次に、そのPSDを1つのムービークリップとして保存します(ネストされたアニメーション?)私はすでにFlashレイヤーを含むPSDをステージにインポートしてから、各ボタンを与えましたおよび Textinput のプロパティを入力してから、それらをネストされたアニメーションとして保存しますが、クラスドキュメントからそのムービークリップを呼び出す必要がありますか? または、ドキュメント クラス (Main.as) のすべてのムービークリップをリンクしますか?

2.) クラス ファイルからムービークリップにアクセスするにはどうすればよいですか。var login:Login = New Login、addChild(login) を試しました。これにより、ムービークリップが追加されますが、どの機能も機能せず、ボタンの名前ごとに未定義のプロパティへのアクセスを示すエラーが発生します。

3.) そして、1 つのボタンがクリックされ、それが別のページ (PSD) にリンクしている場合、以下を実行しますか?

h.addEventListener(MouseEvent.CLICK, fl_ClickToGohome);

 function fl_ClickToGohome(event:MouseEvent):void
{
    gotoAndStop("register.as");

御時間ありがとうございます

4

1 に答える 1

1

.asタイムラインとは別にファイルでプログラミングすることも、それほど違いはありません。ドキュメント クラス (Actionscript 設定パネルにあります) を使用している場合、クラス固有のプログラミングの突然の変更に少し気が重くなるかもしれません。移行をよりスムーズにするために、現在のタイムライン コードを新しいcode.asファイルに (そのまま) ダンプし、タイムラインに次の行をドロップするだけです。

include "code.as";

これは、コードを効果的にコピー/貼り付けして実行するだけですが、適切なコードエディター ( Sublime Textなど) を使用できるようになりました。さらに、新しいクラスではないため、そこに記述するコードは、タイムラインと同じスコープを持ちます。

2)。関数は、作成された名前空間にのみアクセスできます (これがおそらく、ドキュメント クラスが「未定義のプロパティへのアクセス」エラーをスローしていた理由です)。関数の引数を使用して、いつでもオブジェクト (および拡張によりその名前空間) への参照を渡すことができます。

1)。最初の質問に答えるために、ムービークリップを作成し、好きなだけ深く、好きな順序でネストできます。重要なことは、そのオブジェクトに移動する方法を認識することです。たとえば、次のステージ階層を考えてみましょう。

root:MainTimeline ¬
    0: PSD_one:MovieClip ¬
        0: backgroundImage:Bitmap
        1: button:Sprite
        2: txt:TextField
    1: PSD_two:MovieClip
    2: PSD_three:MovieClip

タイムラインには 3 つのオブジェクトがあり、それぞれに 0 から始まるインデックスがあります。最初の PSD は、3 つの子要素を持つMovieClip DisplayObjectContainerで、それぞれにオブジェクトのアドレス指定に使用できる name プロパティがあります。Flash IDE では、これらの「インスタンス」にラベルを付けます。「ステージ インスタンスを自動的に宣言する」というラベルの付いた Actionscript 設定パネルで IDE が有効にした内部マジックにより、自動的に親オブジェクトのプロパティになります。

魔法のソース

つまり、 のテキストを変更するには、 とtxt書くことができますPSD_one.txt.text = "foo"。この設定がないと、 のようなコンテナー メソッドを使用する必要があります。現在のスコープにはそれと呼ばれるプロパティがないため (つまり、暗黙的に) 、完全な呼び出しは機能しません。root.getChildByName("PSD_one").getChildAt(2)txt.text = "foo"this.txt

3)。 gotoAndStopタイムライン フレームを制御する MovieClip メソッドです。古いやり方から完全に脱却したいのなら、フレームの使用をやめるべきです。

これらの PSD を表示するには、2 つの方法があります。

方法 1: Flash IDE を使用してステージ上で PSD をインスタンス化し、コード内で参照できる一意の名前をそれぞれに付けます。PSD_two.x = this.loaderInfo.width上記のレイアウトを想定すると、次の「フレーム」に「移動」したいときに、各 PSD を画面外に移動し ( などで)、画面の中央にスワップすることができます。

方法 2: 慣れているように PSD をライブラリにインポートしましたが、インスタンス化はしません。代わりに、コードに直接ジャンプし、誰かがボタンhをクリックして に移動するfl_ClickToGohomeと、関数がライブラリ オブジェクトを選択して手動でインスタンス化し、addChild()を使用してステージにペアレント化します。

function fl_ClickToGohome(e:MouseEvent):void {
    var psd:PSD_one = new PSD_one();
    addChild(psd);
}

この種のアプローチは、アセットの動的ロードを開始する場合に適しています。もちろん、既に作成されたPSD_oneクラスをライブラリに含めるのではなく、単純にURLLoader()またはLoader()を使用し、完全な PSD ではなく、圧縮された画像を保存する必要があります。

これが役立つことを願っています。私はあなたの質問に直接答えていないことを知っていますが、問題は特定のコードではなく、実装方法に起因する場合があります。

-乾杯


あなたの質問に答えるために...

1: オブジェクトへのパス

オブジェクトへのパスがわからない場合は、この関数を試してください。自分の作品で使っているものの縮小版です。

function listLayers(obj = null, indent:String = ""):void {
    // If no object was provided, start with the MainTimeline
    if (obj == null) { obj = root; }

    for (var i:int = 0; i < obj.numChildren; i++) {
        // Make a pointer to the object at this index
        var item = obj.getChildAt(i);

        // Get the item type
        var type:String = flash.utils.getQualifiedClassName(item);
        if (type.lastIndexOf("::") != -1) {type = type.split("::")[1];}

        var msg:String = indent + i + ": " + item.name + ":" + type;
        if (type != "TLFTextField" && item.hasOwnProperty("numChildren") && item.numChildren > 0) {
            trace(msg + " ¬");
            listLayers(item, indent + "  ");
        } else {
            trace(msg);
        }
    }   
}

これにより、ステージの構造が上で見たのとほぼ同じ形式 (PSD を使用) で出力されます。getChildByNameその後、ルートから子までを使用できます (ハード ドライブ上のフォルダーをナビゲートするのと同じように、フル パスを指定する必要があります)。

2: パブリック/プライベート名前空間

これらは専用クラスでのみ使用されます。前述の方法を使用している場合includeは、タイムライン コードと同様にこれらを省略します。これらは、クラスの「外部」からプロパティ/メソッドにアクセスできるかどうかを示します。始めたばかりの場合は、すべて公開のままにします。後で取り組む準備ができたら、メモリの最適化について心配することができます。

3: クラスはどのようにボタンにアクセスしますか?

DisplayList をフォルダー構造として考えるのが最も簡単な方法です。

ここに画像の説明を入力

あなたは書くかもしれません

C:/Users/Me

DisplayList のどちらがより似ているか

C.Users.Me

もちろん、 と呼ばれるルートの場所はありませんC。オブジェクトはおそらく and と呼ばれPSD_onemyButtonいるため、次のように書き換えることができます...

root.PSD_one.myButton

これは、実際にオブジェクトにこれらのプロパティが事前に定義されていることを前提としていますが、これはオブジェクトを動的に作成する場合には発生しません。そのような場合、次のようにコマンドをつなぎ合わせます。

root.getChildByName("PSD_one").getChildByName("myButton")

クラスを作成することは、ネットワーク上に新しいコンピューターを作成するようなものです。そのクラスと MainTimeline の間に直接的な関係はありません。それらを接続する必要があります。

DisplayListObject (スプライトなど) をインスタンス化してステージに追加すると、オブジェクトはstageroot、 などのいくつかのプロパティを自動的に取得します。これらは、クラスが に接続してその上のオブジェクトにアクセスするために、クラスが内部から参照できるプロパティです。parentnullMainTimeline

逆に、必要に応じて、次のように、ステージへの参照をコンストラクター引数からクラスに渡すことができます。

var foo:MySprite = new MySprite(stage);

于 2013-10-28T14:38:56.787 に答える