0

私はiPhoneゲームを持っています。そこには30以上のCGRectがあり、ユーザーが触れたかどうかを簡単に判断する必要があります。私はこれまで、フォロー設定を使用して、ユーザーがタッチの内側でCocos2dのCGRectに触れたかどうかを検出することを検討していました。だから私はCGRectsのベクトル(Iがobj-C++を使用しています)があります。ユーザーが多くのCGRectに触れたかどうかを素早く判断する方法

for (int i = 0; i < (int) vec_of_cgrects; i++) { 
    if (CGRectContainsPoint(vec_of_cgrects[i], location) { 
     //Do what I need to do if user touches one of the rectangles 
    } 
} 

をしかし、これはその効率的ではありません。この場合、ユーザは、特定の矩形に触れた場合、私は検出するための最良の方法を疑問に思って長方形のベクトルまたはより良い方法がある場合。

+0

30実際には大きな数字ではありません。おそらくNSArrayとNSValueを含む "Objective-Cの方法"をやっていないことを嬉しく思います。 –

+0

@tc:少なくとも30 ... ...そして、私はNSMutableArrayを使うつもりでしたが、ストアの構造体。そして、私はええのようだった!今では私が学んだ最初の言語であるC++を使うようになりました...私はメッセージングスタッフシステムのオブジェクトObj-Cにうんざりしています... – Dair

答えて

0

ユーザーが触れる矩形ごとに何か起こりたいのですか、ユーザーが古い四角形にタッチすると1つのイベントが発生しますか?

両方の状況で改善できる点の1つは、CGRectをx座標(またはそれがあなたの状況に適している場合はy座標)で並べ替えることです。そのため、CGRectのx座標がタッチのx座標。

後者の場合、CGRectが他のCGRectに完全に含まれているかどうかを事前に確認することもできます。その場合は、CGRectをアレイから削除してください。

+0

良いアイデアは、4つのセグメントに画面を分割して、適切なCGRectを適切なセグメントに格納し、画面の4つの象限のうちの1つの矩形への検索スペースを減らすマルチディムベクトルです。 – Dair

0

代わりの非効率な近似ch:幅*高さリストの配列を格納します。各リストに、そのピクセルをカバーする四角形のリスト(または、ある種のオーバーラップ処理を行う場合は「上の」矩形)を入力します。 O(1)ルックアップ!

「ハッカーの」アプローチ:画面をh * hのサイズの正方形に分割します。ここでh〜=(幅+高さ)/ sqrt(n)です。上記のように各四角形を配置します。 O(sqrt(n)) - ishルックアップ。

ツリーベースのアプローチと同じくらい良いものではありませんが、ツリーは生成するのに苦労するかもしれません。

関連する問題