0

フレームごとに呼び出されるボディ間の接触をチェックするスケジュールされた機能があります。

特定のCCSpriteとの間のタッチを確認したいときはb2body、まずそれらが画面上に存在するかどうかを確認します。次に、関連する種類のすべてのスプライトで for ループを実行します。したがって、接触を確認したい3匹の犬がいる場合、画面上のすべての犬のスプライトで各フレームを実行する必要があります。問題は、FPS が低下し、ゲームが少しぼやけてしまうことです (スタック フレーム)。

多くのスプライトで接触中に実行し、FPS を落とさないようにするにはどうすればよいですか?

//in my contact check that relevant sprites are exist,than check contact
   if([self getChildByTag:1] && [self getChildByTag:300])
            {
                // run on 10 sprites and check contact
                for(int i=0;i<10;i++)
                 {
                     if( CGRectIntersectsRect ([[self getChildByTag:300+i]  boundingBox], [sprite boundingBox]))
                     //do something
                  }

接触がない場合でも、フレームレートで非常に多くの条件を確認したという事実だけで、いくつかのリークが発生します。

4

1 に答える 1

2

getChildByTag は、子配列を列挙して、一致するタグを持つ最初のノードを見つけます。これらのノードが children 配列の最後近くにあり、多くの子が存在する場合、これは多くのパフォーマンスを浪費します。

これらの 300+i ノードを別の配列に格納し、その配列にプロパティを介してアクセスできるようにすることをお勧めします。

sprite各反復でboundingBoxメッセージを送信する代わりに、boundingBoxをローカルに保存する必要もあります。

さらに、すべてのコンタクト イベントでこのコードを実行します。10 個の物体が互いに接触している場合、同じコードが 10 回実行されます。少なくとも。特定の状況では、 contactBegan は、接触しているボディごとにフレームごとに複数回呼び出される可能性があるためです (複数の接触ポイントがある場合)。

また、疑問が生じます: 2 つの接触するボディが既にあるのに、なぜ CGRectIntersectsRect を使用するのでしょうか? 非物理体の接触をテストしようとしない限り、冗長に思えます。

于 2013-08-05T12:05:38.193 に答える