まず、parent
実際にゲームのみを削除していることを確認するために、1 つを削除する必要があります。
function BackToMenu(i:MouseEvent):void
{
var BaseMovie:MovieClip = parent as MovieClip;
BaseMovie.parent.removeChild(BaseMovie);
}
これにより、最も差し迫った問題が解決され、メニューに戻ることができます。ただし、ゲームを実際にアンロードしたわけではなく、表示リストから削除しただけです。これは多くの場合、実行中のサウンド、アクティブなキーおよび/またはマウス リスナーなどがあることを意味します。これらはすべて処理する必要があります。
そして、私が言ったように、これはあなたの差し迫った問題を解決するだけです. ただし、これは永続的な解決策でも良い解決策でもありません。メインの SWF はゲームのロードを担当するため、ゲームの破棄も担当する必要があります。クリーンアップ コードをゲームに挿入する必要がありますが、実行中のスクリプトやサウンドなどを停止することのみに関係する必要があります。 - 簡単なルール:ゲーム内で開始されたものはすべて、ゲーム内で停止する必要があります。ただし、表示階層のさらに上のオブジェクトにアクセスしようとしたり、自身をアンロードしようとしたりすべきではありません。
これを行うより良い方法は、上記のコードをすべて置き換え、メインの SWF にゲームの削除とメモリからのアンロードを任せることです。そのためには、次の 3 つのことを行う必要があります。
実際の呼び出しなどを記述する代わりにremoveChild
、ボタンがカスタム イベントをディスパッチして、メインの SWF に削除する必要があることを通知します。
function onBackButtonClicked( event:MouseEvent ):void {
destroyGame(); // this would be the function that stops all the scripts
dispatchEvent( new Event( "FINISH_GAME", true ) );
}
「FINISH_GAME」は現在「バブリング」イベントであることに注意してください。つまり、表示階層を下に移動します。ゲームを含む祖先表示オブジェクトでこのイベントをリッスンできるようになりました。
Loader
メイン SWF で、ゲームが正常にロードされたときにイベント リスナーを追加します。これは、ロード プロセスの完了時に呼び出されるイベント リスナーで行われます。
function onLoadComplete( event:Event ):void {
var loader:Loader = event.target.loader;
loader.addEventListener( "FINISH_GAME", onFinishGame, true );
}
対応するイベント ハンドラーを使用して、ゲーム クリップを削除します。
function onFinishGame( event:Event ):void {
var loader:loader = event.currentTarget;
loader.parent.removeChild( loader );
loader.unloadAndStop();
}
さらに考慮すべき点がいくつかあります。
ActionScript の命名規則では、メソッドと変数には小文字の名前を使用し、型には大文字のみを使用することをお勧めします。
同じ命名規則により、イベントの名前とともに、イベント リスナーの接頭辞として "on" または "handle" を使用することが推奨されます。したがって、それは、onBackToMenu
またはむしろ、onBackButtonClicked
などである必要があります。
ロードに使用するコードについては何も知らないので、完全なリスナーがあり、ローダーへの参照を保持していないと仮定しました。メンバー変数を使用する場合は、代わりにそれを使用できますevent.target
。event.currentTarget
.