我有一个iPhone游戏,可能有30个(或更多)CGRects,我需要一个快速的方法来确定用户是否触摸了一个。我之前一直在考虑使用以下设置来检测用户是否触摸了Cocos2d中的CGRect触摸开始。所以我有一个CGRects的载体(我正在使用Obj-C ++):
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 :(得分:0)
您想要为用户触摸的每个矩形发生一些事情吗?或者用户触摸任何旧矩形时会发生一个事件?
在这两种情况下你可以做的一个改进就是用你的x坐标(或y坐标,如果你的情况更适合你的情况)对CGRects进行排序,这样你就可以在CGRect的x坐标大于触摸的x坐标。
如果是后者,您还可以事先检查其他CGRect是否完全包含CGRect,如果是,请将其从阵列中删除。
答案 1 :(得分:0)
您可以考虑使用Spatial Hash:
http://www.gamedev.net/index.php?app=core&module=search&do=search&fromMainBar=1
以下是关于Cocos2d论坛的帖子:
http://www.cocos2d-iphone.org/forum/topic/11323#post-64132
Chipmunk和Box2d使用它(物理库)我非常肯定他们的碰撞检测......
答案 2 :(得分:0)
替代低效方法:存储宽度*高度列表数组。使用覆盖该像素的矩形列表填充每个列表(如果进行某种重叠处理,则填充“顶部”矩形)。 O(1)查找!
“黑客”方法:将屏幕划分为大小为h * h的正方形,其中h~ =(宽度+高度)/ sqrt(n)。如上所示填充每个方块。 O(sqrt(n)) - ish查找。
两者都不如基于树的方法那么好,但树可能会产生痛苦。