我已经在一个非常复杂的问题上工作了一段时间。现在,我在这里发帖,希望有人能给我一个解决方案的提示。
正如主题中所述,该问题与不规则形状上的碰撞检测(UIView)有关。
到目前为止,我所做的是:
使用THIS作为起点,我完成了一个UIImageView子类,它可以检查frame属性上的alpha/非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");
}
}
}除了性能之外,一切都运行得很好。对于生产应用程序,检查速度太慢。
为了解决这个问题,有没有我不知道的变通方法或解决方案?
希望澄清,致以最良好的敬意
发布于 2011-07-03 16:37:04
你可以在不规则物体周围生成一个圆,以减少初始计算,然后如果与圆发生碰撞,那么继续检查它是否真的发生了碰撞。可以基于在圆上检测到碰撞的位置来潜在地减少所检查的点集。
发布于 2011-07-03 17:07:29
我不确定最后的任务是什么,我对iOS编程也不是很熟练,但有一次我为一个OpenGL游戏编写了碰撞检测方法。这和你的任务非常相似,我想:我想检查两个以某种方式转换(旋转,缩放)的alpha通道图像之间的碰撞。检查背后的基本思想是:
快速检查每个图像的边界和冲突区域之间的冲突,并按像素进行检查。
由于您使用的是UIView而不是位图,因此我可以建议您检查架构并使用图像/层(如果您有某种类型的游戏),或者为视图准备一些位掩码。对碰撞遮罩(alpha通道)的低级访问速度非常快,这样的检查不会影响性能。此外,据我所知,你不需要旋转矩阵-这进一步简化了任务。
我的旧游戏代码在10年前的机器上运行,它能够在30fps内检查数百个物体的碰撞。
最后,如果你的任务是游戏或类似的--你没有想过使用某种游戏引擎吗?也许cocos2d
https://stackoverflow.com/questions/6561860
复制相似问题