2017-11-03 5 views
1

去年は、生徒にキャッチを作成し、AS3でFlashでゲームを避けるように教えてくれた最初の年でした。今年は良くなってきています。毎年私は少なくとも一度は助けを求めてここに来ます。AS3でのショットの衝突のチェックとショットとターゲットの削除

私は、2番目のゲームプロジェクトの可能性に射撃を追加しようとしています。私は、船、銃、何でも何でも起こして、それを動かすことができ、それがスクリーンから外れているときにそれを取り除くが、ショットとターゲットの両方を消すためのきれいな方法を考え出していない(removeChildおよびarray.splice)を呼び出します。

私は作品のの並べ替えを持っていますが、私は老い得続けるコード 『はTypeError:エラー#1010:用語が定義されていないとプロパティがありませんがDropShootV02_flaで :: MainTimeline/checkShots()』。 通常、これはオブジェクトとインデックス番号の不一致が原因であることがわかりますが、これはボックスと箇条書きを削除する際の2番目の配列への呼び出しに関連しています。 簡単にするために、私はちょうど射撃コードを含むでしょう。同様の組織がボックスを作成してドロップします。

何か助けていただければ幸いです。私たちはASファイルで外部スクリプトを使用していません。私は以前と同じエラーを取得保管することをしようとした :kaarto

var shotSpeed = 18; 
var shots:Array = new Array(); 
import flash.events.MouseEvent; 
import flash.events.Event; 
stage.addEventListener(MouseEvent.CLICK, fireLaser); 
function fireLaser(e:MouseEvent):void 
{ 
    if (gameOn==true) 
    { 
     var shot:Shot=new Shot(); 
     addChild(shot); 
     shots.push(shot); 
     shot.gotoAndStop(1); 
     shot.x = user.x; 
     shot.y = user.y; 
     trace(shots.length); 
    } 
} 
addEventListener(Event.ENTER_FRAME, moveShot); 
function moveShot(e:Event):void 
{ 
    for (var i:int=shots.length-1; i>=0; i--) 
    { 
     shots[i].y -= shotSpeed; 
     if (shots[i].y < -25) 
     { 
      removeChild(shots[i]); 
      shots.splice(i,1); 

     } 
    } 
} 
addEventListener(Event.ENTER_FRAME, checkShots); 
function checkShots(e:Event):void 
{ 
    for (var i:int=shots.length-1; i>=0; i--) 
    { 
     for (var k:int=boxes.length-1; k>=0; k--) 
     { 
      if (shots[i].hitTestObject(boxes[k])) 
      { 
       if (boxes[i].type == "good") 
       { 
        score--; 
        scoreDisplay.text = "Score:" + score; 
       } 
       if (boxes[i].type == "bad") 
       { 
        score++; 
       } 
       removeChild(boxes[k]); 
       boxes.splice(k,1); 
       //if I leave this part out I get no errors, 
       //but but the bullet goes on to strike again 
       removeChild(shots[i]); 
       shots.splice(i,1); 
      } 
     } 
    } 
} 

感謝。私はこのゲームコードのどこかでそれを使用しました。私は、プレーヤーがどのくらいの頻度で撮影しているかを調整する必要があったことが分かります。代わりに、マウスを使った撮影からスペースを使用するように変更しました。問題はなくなりました。休憩は間違いなくここで良いです。

+3

ヒットしたら、ボックスとショットを削除します。その後、内側のループは次のボックスで別のラウンドに進みますが、すでに削除したショットと同じhitTestObjectを試行します。したがって、ヒットしたときに内側のループを '中断'することによって、外側のループも処理することを覚えておく必要があります。 – kaarto

+1

@Kaartoはあなたの制限にかかわらず、プレイヤーがどのくらいの頻度で撃つことができるかにかかわらず、命中テストが成功し、それが 'k'の最後の反復でない場合、' shot [i] 'が次の反復でエラーになります存在する(あなたがそれをスプライスしたので、今では '私は範囲外になる)。残念なことに、あなたは 'removeChild(boxes.removeAt(k));で削除を単純化することができます。 - パフォーマンス上の理由から、入力フレームハンドラを1つにまとめることをお勧めします。 – BadFeelingAboutThis

+0

@RobCampbellについては、[cseducators.se]コミュニティをチェックしてみてください。 –

答えて

-2

move shotcheckShotsを1つのENTER_FRAMEハンドラにまとめます。