1

ActionScript 3 を使用して、Adobe Flash CS4 で簡単なゲームを作成しています。最近、使用していたプレースホルダーを置き換えるために、非常に小さな新しいプリローダーを実装しました。しかし、これをやると、すべてが壊れたように見えました。

最初のフレームにはstop();「アクション」のみがあり、次に独自のクラスファイルにあるプリローダーを設定する DocumentClass 外部クラスファイル (私のクラスはすべて外部です) があります。プリローダーが完了すると、DocumentClass に対してイベントが発生し、gotoAndStop(3);. スライド 3 は、独自のクラス ファイルを含む、Mainというタイトルのムービー クリップです。

メインはたくさんのものをインポートしてから、ゲームのオープニング画面をロードします。この時点で、基本的にすべてが崩壊します。この開始画面 (クラス ファイルと MovieClip オブジェクトの両方を含む) にあるものを変更しようとすると、「TypeError: エラー #1009: null オブジェクト参照のプロパティまたはメソッドにアクセスできません」という結果になります。このコードは、MovieClip がステージに登場する前に実行されているのではないかと考えたので、コードを追加して関数addEventListener( Event.ADDED_TO_STAGE, onAddtoStage );に移動しました。onAddtoStage実行中に null 以外の適切な値が返さtrace("this is the stage: "+stage);trace("this is my parent: "+this.parent);ますが、何も変更できません (たとえば、非表示に設定して非表示にしたい MovieClip オブジェクトを作成すると、invisibleBG.alpha = 0;エラー #1009 が返されます)。

さらに、メインムービークリップがステージ上に表示されている間、オープニング画面のムービークリップは表示されません。どういうわけかメインオブジェクトの背後にあるかどうかはわかりませんが、ステージ上にまったくないように見えます。

以下に私のコードの一部があります。これで何が問題なのかがわからない場合は、さらに追加できます。私はこれについて本当に頭を悩ませてきました。もちろん、a が 2 つのフレームに引き伸ばされているために変更できないことを理解するのに 2 日かかったTextFieldので、非常に簡単な解決策があるかもしれません。よろしくお願いします。

初期ロードを処理するクラスのほとんどは次のとおりです。

public class DocumentClass extends MovieClip  
{
    public var loadingScreen:LoadingScreen;

    public function DocumentClass()
    {
        loadingScreen = new LoadingScreen();
        addChild( loadingScreen );

        stage.stageFocusRect = false;

        loadingScreen.addEventListener( Event.COMPLETE, onPreloaderComplete );
        loadingScreen.setLoaderInfo( loaderInfo );
    }

    public function onPreloaderComplete( e:Event ):void
    {
        loadingScreen.removeEventListener( Event.COMPLETE, onPreloaderComplete );
        removeChild( loadingScreen );
        loadingScreen = null;

        gotoAndStop( 3 );
    }
}

Mainクラスの関連部分は次のとおりです。

public class Main extends MovieClip
{
    public function Main()
    {
        showDesktop();
    }
    public function showDesktop():void
    {
        desktopScreen = new DesktopScreen();
        addChild( desktopScreen );

        stage.focus = desktopScreen;
    }
}

そして、ゲームの開始画面であるDesktopScreenの関連部分:

public class DesktopScreen extends MovieClip
{
    public function DesktopScreen()
    {
        addEventListener( Event.ADDED_TO_STAGE, onAddtoStage );
    }

    public function onAddtoStage( e:Event ):void
    {
        Mouse.show();

        invisibleBG.alpha = 0;
        fakeButton.stop();

        time = new Time;
        time.x = 504;
        time.y = 3;
        addChild( time );
    }
}

TL;DRムービークリップをステージに追加していますがtrace、ステージ上にあると関数を介して認識できますが、実際に必要な方法でムービークリップを表示したり、内容を変更したりすることはできません舞台に立つ。

4

1 に答える 1

0

さて、今日はこれを修正することができました。これが何が起こったのかです。

新しいプリローダーを実装したとき、こちらで詳しく説明されている 3 フレーム方式を使用しようとしました。ところで、プリローダーを探しているなら、これはプリローダーに関する優れた一般的なチュートリアルです。

ただし、チュートリアルの後半で 4 フレーム方式を使用しようとしましたが、重大な事実を見落としていました。Flash は、アセットが存在するフレームに到達するまでアセットにアクセスできません。したがって、フレーム 1 にはプリローダー (および非常に小さな DocumentClass) のみがあり、フレーム 2 はクラス フレームであり、フレーム 3 には Main オブジェクトとそれに関連するコードがあり、フレーム 4 にはすべてのライブラリ オブジェクトを含む AssetHolder オブジェクトがありました。

その結果、 を実行gotoAndStop(3);すると、Main クラスとオブジェクトが使用可能になり、DesktopScreen クラスとオブジェクトが呼び出されました。しかし、 (フレーム 2 のように) DesktopScreenクラスのみが使用可能で、オブジェクトは使用できませんでした (フレーム 4 まで使用できません)。その結果、コードは実行されましたが、実際にはステージ上に何もなかったので (Flash がステージ上にあると言っていたにもかかわらず)、大量のエラーがスローされました。

ここでMichael James Williamsによる非常に有益なチュートリアルを確認したとき、私は最終的にこれを理解しました. これは、Flash の使用を開始しようとしている場合に確認すべきもう 1 つの優れたチュートリアルです。

したがって、これは簡単に修正できました。アセットに (不要な) フレーム 4 を使用するのをやめ、代わりにフレーム 2 に移動します。フレーム 1 はまだstop();アクション パネルにあるため、ロードが開始されるとすぐにゲームが停止し、DocumentClass を見て、プリロードを開始してから進みます。フレーム 3 に (すべてのアセットとクラスが使用可能になった後) ロードされます。

これが、同様の、信じられないほどあいまいな問題を抱えている人の助けになることを願っています。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-01-04T14:17:52.760 に答える