Iphone核心动画坐标跟踪和碰撞

Iphone核心动画坐标跟踪和碰撞,iphone,cocoa-touch,core-animation,Iphone,Cocoa Touch,Core Animation,我目前正在学习Iphone编程,但我在思考CAKeyframeAnimation时遇到了一些问题 我使用CAKeyframeAnimation在屏幕上设置对象动画,如下所示: CGPathMoveToPoint(路径,NULL,start.x,start.y); CGPathAddLineToPoint(路径,NULL,finish.x,finish.y); animation.path=路径; animation.duration=animationDuration //将动画组添加到层中 [

我目前正在学习Iphone编程,但我在思考CAKeyframeAnimation时遇到了一些问题

我使用CAKeyframeAnimation在屏幕上设置对象动画,如下所示:

CGPathMoveToPoint(路径,NULL,start.x,start.y); CGPathAddLineToPoint(路径,NULL,finish.x,finish.y); animation.path=路径; animation.duration=animationDuration

//将动画组添加到层中 [层添加动画:动画分叉:@“动画化”]

我使用这个基本想法来移动我的对象,但现在我希望能够检测对象之间的碰撞

我在考虑给屏幕上的每个动画对象添加一个观察者 [观察员:…]

当位置改变时,调用一个方法,对照所有其他动画对象的位置检查当前位置

问题是可能会有很多对象(可能最多100个(估计数,但可能更多)),移动来检查10-20个对象的碰撞列表。 因此,我担心每次迭代都会有大量的测试


你建议我做什么?

做好碰撞检测可能是一个棘手的问题。通常,独立于图形进行建模是个好主意。我建议您熟悉一些内置了碰撞检测的开源物理引擎。是一个受欢迎的好选择,它拥有适合iPhone游戏的自由许可证

在一个有很多移动动画的游戏中使用核心动画转换可能会很棘手。动画期间CALayer的实际位置不会反映在其坐标中,而是取决于您的选择的终点或起点。因此,您需要为此构建自己的抽象。编辑:正如Brad所指出的,在动画过程中,您可以从演示层获得位置

你建议我做什么

我认为核心动画不是应用程序的正确框架。100个精灵将在iPhone上推广核心动画的功能,而且,没有办法获得您需要的更新类型

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

             }
        }
   }
}

我对大量对象的性能不是很确定,但这会起作用。您还需要处理存储检测到的冲突,否则您将检测每个冲突两次。

我认为CoreAnimation(CA)旨在用于不影响您的“业务逻辑”(或游戏逻辑)的动画,而只是取悦用户或给他视觉反馈。如果您需要做的不仅仅是取消动画或在动画完成时收到通知,那么这是一个强烈的反对使用CA的指示


正如龙舌兰多所指出的,将碰撞和图形分开通常是个好主意。或者更一般:对于用户来说,图形通常是单向的。渲染的结果很少会影响程序的其他部分。

实际上,您可以通过抓取层中动画的presentationLayer并查询它来获取该层的当前位置。我相信您是对的。我很确定CA不会用这种基于帧到帧的动作来完成它。这与OpenGLES不谋而合。