【问题标题】:How to determine quickly if the user touched one of many CGRects如何快速确定用户是否触摸了许多 CGRect 之一
【发布时间】:2011-06-28 04:16:59
【问题描述】:

我有一个 iPhone 游戏,其中可能有 30 个(或更多)CGRect,我需要一种快速的方法来确定用户是否触摸了一个。我之前一直在考虑使用以下设置来检测用户是否在触摸开始时触摸了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
    }
}

但这不是那么有效,我想知道这是否是检测用户是否触摸矩形向量的特定矩形的最佳方法,或者是否有更好的方法。

【问题讨论】:

  • 30 确实不是一个大数字。很高兴你没有以可能涉及 NSArray 和 NSValue 的“Objective-C 方式”做事......
  • @tc.: 至少 30... 哈哈,我本来打算使用 NSMutableArray 但它们不能存储结构。然后我就像是的!现在我开始使用 C++,这是我学到的第一门语言……我厌倦了 Obj-C 的消息传递系统……

标签: iphone cocos2d-iphone collision-detection objective-c++


【解决方案1】:

您希望用户触摸的每个矩形都发生一些事情,还是希望用户触摸任何旧矩形时发生一个事件?

您可以在这两种情况下进行的一项改进是按 CGRect 的 x 坐标(或 y 坐标,如果更适合您的情况)对 CGRect 进行排序,这样您就可以在 CGRect 的 x 坐标大于touch的x坐标。

如果是后者,您还可以事先检查是否有任何 CGRect 被其他 CGRect 完全包含,如果是,则将它们从数组中删除。

【讨论】:

  • 好主意,我想我把屏幕分成四段,然后制作一个多维向量,将适当的CGRects存储在适当的段中,然后将我的搜索空间缩小到一个矩形屏幕的 4 个象限。
【解决方案2】:

您可以考虑使用空间哈希:

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 使用它(物理库)我很确定它们的碰撞检测...

【讨论】:

    【解决方案3】:

    另一种低效方法:存储宽度*高度列表的数组。用覆盖该像素的矩形列表(或“顶部”矩形,如果您进行某种重叠处理)填充每个列表。 O(1) 查找!

    “黑客”的方法:将屏幕分成大小为 h*h 的正方形,其中 h ~= (width+height)/sqrt(n)。如上所述填充每个正方形。 O(sqrt(n))-ish 查找。

    两者都不如基于树的方法,但生成树可能会很痛苦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多