0

これが非常に明白な質問である場合は、お詫び申し上げます。

ミニゲームにhitTestObjectifループを追加したいと思います。障害物は配列内の3つのアイテムであり、3つすべてが1秒のタイマークラス遅延で連続して個別に再生されるムービークリップです。ただし、ループ(私が想定している)が原因で、hitTestObjectifステートメントがトレース'hit'もエラーも返さないため、これをどのように解決する必要がありますか?

前もって感謝します!

function randomSort(a:*, b:*):Number
{
    if (Math.random() < 0.5) return -1;
    else return 1;
}
var obstacleArray:Array = [obstacleCar,obstacleCar2,obstacleCar3];
obstacleArray.sort(randomSort);

//(no need for the shuffledLetters[] Array)
trace(obstacleArray);
trace(obstacleArray.length);


//OBSTACLE START DELAY
var timerPlay:Timer = new Timer(1000,1);
timerPlay.addEventListener(TimerEvent.TIMER, ontimerPlay);
timerPlay.start();
var i:int = 0;
var timerDelay:Timer = new Timer(1000, 3);
function ontimerPlay(evt:TimerEvent):void{
    if (carTarget.hitTestObject(obstacleArray[i]) == true){
    trace("HIT!");
    }
    //FOR EACH OBSTACLE

    timerDelay.addEventListener(TimerEvent.TIMER, ontimerDelay);
    timerDelay.start();

}
function ontimerDelay(evt:TimerEvent):void{
    obstacleArray[i].play();
    trace(i);
    i++;

} 
4

2 に答える 2

0

作成した最初のタイマーは1秒間だけ持続します。これは、衝突を効果的にチェックしているのは1回だけであり、障害物が再生を開始する前でもあることを意味します。したがって、障害物が再生されているときは、最初のタイマーハンドラーは呼び出されません。これを確認するためにトレースできます。

于 2013-02-16T03:30:24.887 に答える
0

現在、障害物のムービークリップが再生される前に、ヒットテストを1回実行しています。フレームごとに、ヒットテストを繰り返し実行することをお勧めします。

これをonTimerDelay()に追加します:

if(i === 0) {
    stage.addEventListener(Event.ENTER_FRAME, enterFrameListener)
}

次に、ontimerDelay()の外部でリスナー関数を作成し、そこにヒットテストを配置します。

function enterFrameListener(evt:Event):void {
    var index:int = Math.max(0, i - 1);
    if (carTarget.hitTestObject(obstacleArray[index]) == true){
        trace("HIT!");
    }
}

これにより、carTargetと現在再生中の障害物の間のフレームごとに1回ヒットテストが実行されます。

あなたの語彙に関するメモ:

  1. コードにループはありません。「if」ステートメントはループではなく、「条件付きステートメント」と呼ばれます。
  2. ontimerDelay()は3回呼び出されますが、繰り返し呼び出されても、実際にはループではありません。
  3. コードでは、タイマークラスにヒットテストを追加していません。クラスは、クラスインスタンス(timerPlayおよびtimerDelay)を作成するために使用される一種の青写真です。タイマークラスの「インスタンス」に登録されている「イベントリスナー」にヒットテストを追加します。

編集

コメントで言及したエラーに関して、私の前の例は間違っていました。現在再生中のムービークリップをインデックスiで参照していましたが、実際にはi-1である必要があります。新しい障害物ムービークリップを再生するたびにiをインクリメントするため、iは現在再生中のムービークリップのインデックスではなくなります。 。1を引く必要がないのは、iが0のときだけです。前の例を更新しました。

また、イベントリスナーの登録をonTimerDelayに移動し、ifステートメントでラップして、最初のムービークリップの再生が開始されるまでヒットテストが実行されないようにしました。

編集

2つのオブジェクト間の接触が始まったときにトレース「ヒット」のみが必要な場合は、最後のヒットテストの結果を追跡する必要があります。次に、enterFrameListenerで、最後のフレームでヒットがあったかどうかを確認できます。最後のフレームでヒットがなく、現在のフレームでヒットがあった場合は、「ヒット」をトレースできます。最後のフレームでヒットがあり、現在のフレームでヒットがあった場合は、トレースステートメントをスキップできます。

var lastHitTestResult:Boolean = false;

function enterFrameListener(evt:Event):void {
    var index:int = Math.max(0, i - 1);
    var currentHitTestResult:Boolean = carTarget.hitTestObject(obstacleArray[index])
    if(lastHitTestResult === false && currentHitTestResult === true) {
        trace("HIT!")
    }
    lastHitTestResult = currentHitTestResult
}

onTimerDelayでlastHitTestResultをfalseにリセットしてください。

于 2013-02-16T03:06:10.863 に答える