我目前正在学习Iphone编程,我在围绕CAKeyframeAnimation时遇到了一些麻烦
我正在使用CAKeyframeAnimation为屏幕上的对象设置动画,如下所示:
CGPathMoveToPoint(thePath,NULL,start.x,start.y); CGPathAddLineToPoint(thePath,NULL,finish.x,finish.y); animation.path = thePath; animation.duration = animationDuration;
//将动画组添加到图层 [Layer addAnimation:animation forKey:@“animate”]
我使用这个基本想法移动我的对象,但现在我希望能够检测对象之间的碰撞。
我正在考虑在屏幕上为观察者添加每个动画对象 [动画addObserver:...]
并在位置更改时调用一个方法,该方法根据所有其他动画对象的位置检查当前位置。
问题是可能存在大量对象(可能高达100(估计但可能更多)),正在检查10-20个对象列表以进行冲突。 因此我担心它会在每次迭代时进行大量测试。
你建议我做什么?
答案 0 :(得分:4)
for(UIView *aView in arrayOfMovingObjects){
CGRect aFrame = [(CALayer*)[aView.layer presentationLayer] frame];
for(UIView *anotherView in arrayOfMovingObjects){
if(aView!=anotherView){
CGRect anotherFrame = [(CALayer*)[anotherView.layer presentationLayer] frame];
if(CGRectIntersectsRect(aFrame, anotherFrame){
// handle collision
}
}
}
}
我不太确定使用大量对象的性能,但这可行。您还需要处理存储检测到的冲突,否则您将检测到每次碰撞两次。
答案 1 :(得分:3)
我相信CoreAnimation(CA)旨在用于不会影响您的“业务逻辑”(或那种情况下的游戏逻辑)的动画,而只是取悦用户或给他视觉反馈。如果您需要做的不仅仅是取消动画或在完成动画时收到通知,则强烈指示使用CA 。
正如龙舌兰酒指出的那样,分离碰撞和图形通常是一个好主意。或者甚至更一般:图形通常是通向用户的单向道路。很少有渲染结果影响程序的其他部分。
答案 2 :(得分:1)
做好碰撞检测可能是一个毛茸茸的问题。通常,独立于图形进行建模通常是个好主意。我建议你熟悉一些内置碰撞检测的开源物理引擎。Box2D是一个受欢迎的好选择,它有一个适合iPhone游戏的自由许可。
对于具有大量移动动画的游戏使用Core Animation转换可能会非常棘手。动画期间CALayer的实际位置不会反映在它的坐标中,只会根据您的选择反映在终点或起点上。 因此你需要为此构建自己的抽象。 编辑:正如Brad指出的那样,你可以在动画期间从表示层获得一个位置。
答案 3 :(得分:1)
你建议我做什么?
我认为Core动画不是您应用程序的正确框架。 100个精灵将在iPhone上推动核心动画的功能,并且无法获得所需的更新类型。