不规则形状上的碰撞检测

时间:2011-07-03 08:27:17

标签: objective-c cocoa-touch cocoa uiview uiimage

我已经在一个非常复杂的问题上工作了一段时间。现在,我在这里发帖,希望有人能给我一个解决方案的提示。

如上所述,问题在于关于不规则形状的碰撞检测(UIView)。

到目前为止我做了什么:

使用THIS作为起点,我已经完成了一个UIImageView子类,可以检查其frame属性上的alpha / non-alpha点。在我的对象的UIPanGestureRecognizer选择器上,我附上了一张支票,看看我是否将它移到障碍物上(不是alpha):

- (void)panning:(id)sender {
    UIPanGestureRecognizer = (UIPanGestureRecognizer *)sender;

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {
        startPoint = CGPointZero;
        oldPoint = CGPointZero;
        return;
    }
    actualPoint = [(UIPanGestureRecognizer*)sender translationInView:parentView];

    if(CGAffineTransformIsIdentity(panning)) {
        panning = CGAffineTransformMakeTranslation(actualPoint.x - startPoint.x, actualPoint.y - startPoint.y);
    } else {
        panning = CGAffineTransformTranslate(panning, actualPoint.x - startPoint.x, actualPoint.y - startPoint.y);
    }

    [self setTransform:panning];

    for(UIView *anObstacle in obstaclesArray) {
        CGRect intersection = CGRectIntersection(self.frame, anObstacle.frame);
        if([anObstacle checkAlpha:intersection] != NULL) { 
            NSLog(@"BOOOOOOOOOOOM");
        }
    }
}

除性能外,一切运作良好。生产应用程序的检查速度太慢。

为了解决这个问题,有什么解决方法或解决方案我不知道吗?

希望明确, 最好的问候

2 个答案:

答案 0 :(得分:0)

你可以在不规则物体周围生成一个圆圈以减少初始计算,然后如果与圆圈发生碰撞,则继续检查它是否实际碰撞。根据检测到碰撞的圆圈位置,可能会减少检查的点集。

答案 1 :(得分:0)

我不确定最后的任务是什么,我在iOS编程方面不是很熟练,但是一旦我为OpenGL游戏编写了碰撞检测方法。我想这与你的任务非常相似:我想检查两个以某种方式转换(旋转,缩放)alpha通道图像的碰撞。支票背后的基本理念是:

  1. 快速检查边界之间的碰撞。
  2. 确定每个图像的碰撞区域并进行逐像素检查。
  3. 由于您有UIView而不是位图,我建议您查看架构并使用图像/图层(如果您有某种游戏)或者可能为视图准备一些位掩码。对碰撞掩码(alpha通道)的低级访问非常快,这样的检查不会影响性能。另外,就我所知,你不需要旋转矩阵 - 这更加简化了任务。

    我的旧游戏代码在10年前的机器上工作,它能够以30fps的速度检查数百个物体的碰撞。

    最后,如果你的任务是游戏或类似的 - 你有没有想过使用某种游戏引擎?也许 cocos2d