0

Objective-cのネストされたforループ内のローカル変数で奇妙な動作を観察しています。

以下のコードは、1〜20のサイズのビジターと呼ばれるNSMutableArrayをループします。

オブジェクトのローカルコピーを位置iに保存してから、そのバウンディングボックスを作成します。

次に、最初のループ内で配列を再度ループし、リストから2番目のオブジェクトを選択して、その境界ボックスを調べます。

画面上のオブジェクトが重なっている場合、衝突チェックに到達することはほとんどありません。

デバッガーを使用してコードをステップ実行すると、2番目のforループ内で、変数visitor2が設定されると、それ以降は変更されないことがわかります。関数呼び出しが完了するまで、同じオブジェクトをポイントし続けます。

訪問者配列内のすべてのオブジェクトは、同じオブジェクトが2回配列に追加されないため、完全に一意のオブジェクトです。これを確認しました。

私はこれを引き起こしている可能性があるものがわかりません、私はそれのようなものを見たことがありません。どんな助けでも大歓迎です。

これが私のコードです:

for (int i = 0; i < [visitors count]; i++) 
{

    // Obtain visitor from the list
    Visitor* visitor1 = [visitors objectAtIndex: i];

    // Calculate it's bounding box
    CGRect visitor1rect = CGRectMake(visitor1.position.x - visitor1.size.x/2, 
                              visitor1.position.y - visitor1.size.y/2, 
                              visitor1.size.x, visitor1.size.y);

    // Loop through all other visitors
    for (int j = 0; j < [visitors count]; j++) 
    {
        // Don't check for a collision with self
        if (i != j) 
        {
            // Obtain a visitor from the list
            Visitor* visitor2 = [visitors objectAtIndex: j];

            // Calculate it's bounding box
            CGRect visitor2rect = CGRectMake(visitor2.position.x - visitor2.size.x/2, 
                                      visitor2.position.y - visitor2.size.y/2, 
                                      visitor2.size.x, visitor2.size.y);

            // Chcek of the two bounding boxes intersect
            if ( CGRectContainsRect(visitor1rect, visitor2rect) ) {

                // Do stuff

            }

        }
    }
}
4

1 に答える 1

1

CGRectIntersectsRect「含む」の代わりに交差テストに使用します。これは、何か違うことを意味します。visitor2それで問題が解決した場合は、デバッガーがポイントしていることについてあなたに嘘をついていると思います-コードは正常に見えます。

于 2011-11-12T00:30:48.180 に答える