我有一个“雨”,就像动画从屏幕顶部移动到底部(几个图像从顶部不断下降)。我还有一个由手指在底部控制的篮子图像。我希望应用程序计算任何丢弃图像和篮子之间的“碰撞”数量,如果它们发生碰撞则删除图像。
我使用两个计时器:一个用于从顶部连续丢弃图像。我将每个图像放在一个数组中。然后我有另一个计时器,每0.001,检查一次碰撞。
每次两个物体发生碰撞时我都能得到一个计数,但问题是,它的计算方式太多了!例如,每次视觉碰撞都会计算985次碰撞。我的代码中我做错了什么?: 计时器:
[NSTimer scheduledTimerWithTimeInterval:(0.001) target:self selector:@selector(onCollisionCheckTimer) userInfo:nil repeats:YES];
碰撞检查:
- (void)onCollisionCheckTimer{
for (x = 0; x<100; x++){
CALayer *layer = appleView[x].layer.presentationLayer;
if(CGRectIntersectsRect(basketView.frame, layer.frame)) {
collision++;
printf("%i\n", collision);
[appleView[x] removeFromSuperview];
}
}
}
printf("%i", collision);
正在为每次碰撞输出数百个数字
答案 0 :(得分:1)
首先,您的碰撞测试计时器持续时间太短。实际上,主运行循环每秒只运行约60次,因此您应该使用接近0.016的持续时间。你永远不会得到一个计划的计时器来触发每毫秒。
其次,即使从超级视图中删除,视图也会保留其图层属性。所以可能发生的事情是,即使从superview中删除掉落的对象,你仍然在appleView
集合中迭代它们,并且它们的属性仍然与篮子视图相交。
解决此问题的一种方法是在检查冲突之前检查每个苹果视图的superview
属性。只有当它是非零时才需要进行碰撞测试。