目前,我正在使用纯UIKit构建游戏。这是一个游戏,其中一些角色正在捕捉坠落的物品。所有物体都沿着三个点的轨迹移动:每个物体出现在A点,然后移动到B点,然后降到C点。对我来说,重要的只有一个时刻 - B点的物品。我需要检查,字符是否正在捕获B点中的项目。目前,我在主游戏控制器中有一个定时器,它不断发布通知。游戏项目是观察者,他们听取通知并重新定位自己(他们自己移动)。现在,使用该计时器,每个项目都是从A点到B点的小步骤移动。当它在B点时,项目方法检查,该角色是否正在抓住他。如果不是那么我正在执行UIView动画,持续时间从B点到C点。
我认为可以使用Core Animation CAKeyframeAnimation类或smth对整个动作进行动画制作。唯一的问题是,我不确定如何触发回调以检查动画中间的捕捉 - 在B点。有人说这是不可能here如果我有整个动画和我需要获得当前项目位置然后我需要有一个定时器从presentationLayer拉取/读取模型数据的计时器。但是我不确定这种方法,因为现在,我没有存储指向我主游戏控制器的屏幕项目的指针 - 游戏控制器只创建一个项目,游戏计时器会向这些对象发布通知。但我需要有这样一个才能实现提出的解决方案。另外,我应该从整个屏幕项目中读取presentationLayer。
另一种选择是将一个动画分成两个动画:首先,从A到B动画,然后触发完成回调以检查捕获。然后,执行从B到C的另一个动画。
伙计们,您对此有何看法,或许您有其他建议?
答案 0 :(得分:0)
我认为您需要将其拆分为两个动画。您animationDidStart
只有animationDidStop
和CAAnimation
委托方法是正确的。
使用NSTimer
的方法可能会有问题。 presentationLayer
值将在主线程上更新。我的猜测是检查运行计时器的其他线程上的presentationLayer
值可能会给出不正确的值。
您可以使用performSelectorOnMainThread
解决这个问题。然后,问题是该方法调用的可靠调度。也就是说,当你调用performSelectorOnMainThread
时,运行时可以方便地执行它。
为了记录,我还在用纯UIKit编写游戏。最常见的头痛不是正常比赛中的动画。相反,它会在中断期间停止并恢复它们,例如暂停游戏,接听电话,移动到背景等等。尤其是在游戏处于后台时从内存中清除。
我在这个问题的答案中写了一些关于此的内容:
Restoring animation where it left off when app resumes from background
因此,对于下一场比赛,我将密切关注cocos2d以了解它在这方面提供的内容。