2011-06-28 53 views
0

我有一款iPhone遊戲,其中可能有30(或更多)CGRects,我需要一種快速確定用戶是否觸摸了它的方法。我之前一直在考慮使用下面的設置來檢測用戶是否觸摸了Cocos2d中的CGRect,觸發內部。所以我有一個向量(我用的OBJ-C++)CGRects的:如何快速判斷用戶是否觸碰了許多CGRects

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

你想讓用戶觸摸的每個矩形發生什麼事情,或者用戶觸摸任何一個老的矩形時發生一個事件?

在這兩種情況下你可以做出的一個改進就是通過它們的x座標(或者y座標,如果這更適合你的情況)對CGRects進行排序,所以只要CGRect的x座標大於觸摸的x座標。

如果是後者,您還可以事先檢查CGRect是否完全被其他CGRect包含,如果是,請將它們從數組中刪除。

+0

好主意,我想把屏幕劃分爲四個部分,然後製作一個多暗矢量,它將相應的CGRect存儲在適當的片段中,然後將我的搜索空間縮小爲屏幕4個象限之一中的矩形。 – Dair

0

替代性的低效率認可ch:存儲寬度*高度列表的數組。使用覆蓋該像素的矩形列表填充每個列表(如果您執行某種重疊處理,則使用「頂部」矩形)。 O(1)查找!

「黑客」的方法:將屏幕分割成大小爲h * h的平方,其中h〜=(寬度+高度)/ sqrt(n)。像上面那樣填充每個方塊。 O(sqrt(n)) - ish查找。

兩者都不如基於樹的方法好,但樹可能會產生痛苦。

相關問題