Iphone Core Animation坐标跟踪和碰撞

时间:2009-05-18 16:44:16

标签: iphone cocoa-touch core-animation

我目前正在学习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个对象列表以进行冲突。 因此我担心它会在每次迭代时进行大量测试。

你建议我做什么?

4 个答案:

答案 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上推动核心动画的功能,并且无法获得所需的更新类型。