0

アクション スクリプト 3 で子を追加するときに、いくつかの問題があります。現在、スペース インベーダー ゲームを作成しており、小惑星をステージに追加する関数を作成しています。

私の最初の問題は、新しい小惑星を追加しようとするたびに、以前のすべての小惑星が追加されていることです。

2 つ目の問題は、hitTestOject 関数を追加するときです。宇宙船が小惑星に衝突すると、エラーが発生し、何もしません。

hitTestObject で受け取るエラーは次のとおりです。

TypeError: エラー #1034: 型強制に失敗しました: 「ast_0」を flash.display.DisplayObject に変換できません。spaceanger_fla::MainTimeline/addAstroid() で flash.utils::Timer/_timerDispatch() で flash.utils::Timer/tick()

そして、ここに私のコードがあります。各小惑星が 5000 ミリ秒ごとに追加されるように、タイマーを使用します。

// Add astoid
var astTimer:Timer = new Timer(5000);
astTimer.addEventListener(TimerEvent.TIMER, addAstroid);
var i:Number = 0;
function addAstroid (e:TimerEvent):void{
    var ast = new astroid();
    ast.name = "ast_"+i;
    ast.y = Math.random()*stage.stageHeight;
    ast.x = 565;
    addChild(ast);
    trace(i);
    if(ship.hitTestObject(ast.name)){
        gotoAndStop("2");
    }
i = i+1;
}

astTimer.start();

いくつかのアドバイス、推奨事項、および回答をいただければ幸いです:)

アップデート

ループエラーを整理しました。古い小惑星はもう現れません!:D

どうもありがとう、

ピーター・スチュアート

4

2 に答える 2

1

最初の問題ごとに、i増分は表示されません-常に0です。

名前を割り当てるときは、インクリメントしますi

ast.name = "ast_" + (i++).toString();

基本的に言うとi = i + 1;

次に、ID ではなく、インスタンス自体に対するヒット テストを実行します。

ship.hitTestObject(ast)

あなたのゲームプレイがどのように機能するかはわかりませんが、本当に必要なのは 2 つのハンドラーのようです。

  • 時折新しい小惑星を追加するもの
  • 衝突をテストするもの

現在、addAsteroid()関数は新しい小惑星を追加し、作成時に船と衝突するかどうかをすぐにテストします。その小惑星は二度と衝突のテストを受けることはありません。これが古典的な小惑星ゲームに似ている場合は、各小惑星を配列にプッシュし、ENTER_FRAME各小惑星が船と衝突するかどうかをテストするためのイベント リスナーを追加することができます。

于 2013-05-05T00:23:52.133 に答える