0

画面の上部から下部に移動するアニメーションのような「雨」があります(いくつかの画像が上部から継続的にドロップします)。下部に指で操作するバスケット画像もあります。ドロップする画像とバスケットの間の「衝突」の量をアプリでカウントし、衝突した場合は画像を削除したいと思います。

私は2つのタイマーを使用します。1つは画像を上から継続的にドロップするためのものです。私はそれらの画像のそれぞれを配列に入れました。次に、0.001ごとに衝突をチェックする別のタイマーがあります。

2つのオブジェクトが衝突するたびにカウントを取得できましたが、問題は、カウントが多すぎることです。たとえば、視覚的な衝突はそれぞれ、985回の衝突のようにカウントされます。コードで何が間違っているのですか?:タイマー:

[NSTimer scheduledTimerWithTimeInterval:(0.001) target:self selector:@selector(onCollisionCheckTimer) userInfo:nil repeats:YES];

衝突チェッカー:

- (void)onCollisionCheckTimer{
    for (x = 0; x<100; x++){
        CALayer *layer = appleView[x].layer.presentationLayer;
        if(CGRectIntersectsRect(basketView.frame, layer.frame)) {
            collision++;
            printf("%i\n", collision);
            [appleView[x] removeFromSuperview];
        }
    }
}

printf("%i", collision);衝突ごとに数百の数値を出力しています

4

1 に答える 1

1

まず第一に、衝突テストタイマーの期間が短すぎます。実際には、メインの実行ループは1秒間に約60回しか実行されないため、0.016に近い期間を使用する必要があります。ミリ秒ごとにトリガーするようにスケジュールされたタイマーを取得することはありません。

次に、ビューは、スーパービューから削除された後もレイヤープロパティを保持します。したがって、おそらく起こっていることは、落下するオブジェクトがスーパービューから削除された場合でも、appleViewコレクション内でそれらを繰り返し処理していることであり、それらのプロパティは、バスケットビューと交差しているようなものです。

これを修正する1つの方法はsuperview、衝突をチェックする前に、各アップルビューのプロパティをチェックすることです。nilでない場合にのみ、衝突テストを実行する必要があります。

于 2012-12-01T04:04:56.567 に答える