首先,如果它“完美运行”并且你的游戏快结束了,不要改变你的游戏。如果你现在改变一些东西,你就会冒着对你的游戏玩法产生细微变化的风险,你的游戏将需要更长的时间才能完成,最后玩家可能甚至不会注意到其中的差异。下次您可以尝试不同的方法,但对于您当前的游戏,只要一切顺利,就保持原样。
我相信您所读到的也是我要说的:不要将 CCMoveTo/CCMoveBy 用于游戏对象的(复杂)移动。如果移动非常简单,或者从 A 到 B 的一次性动作,CCMove 动作是可以的。但即便如此,更新位置的更新循环也同样易于实现。
CCMove 动作的问题是当您想要改变方向和/或速度时它们的行为。在这种情况下,您必须创建一个新的移动操作。如果你经常这样做,你会在你的游戏中添加更多的alloc/dealloc循环而不是必要的。其次,CCMove 动作在产生任何效果之前需要一帧不活动。这意味着如果您每帧都创建一个新的 CCMove 动作,那么该游戏对象实际上会被卡住并且根本不会移动。如果您不太频繁地更改它,您仍然会注意到每次对象更改速度或方向时都会出现短暂的停顿。两者都不可取。
替代方案并不像您说的那么复杂。是的,您需要在移动的游戏对象中安排更新,如下所示:
[self scheduleUpdate];
然后实现更新节点位置的更新方法:
-(void) update:(ccTime)delta
{
self.position = CGPointMake(self.position.x + 1, self.position.y);
}
更灵活的运动通常使用速度矢量(CGPoint,通常是实例变量)来确定运动的速度和方向:
-(void) update:(ccTime)delta
{
self.position = ccpAdd(self.position, self.velocity);
}
现在,您可以更加了解如何将速度添加到位置,以及如何更新速度本身。例如,您可以限制速度以确保您的对象的移动速度永远不会超过每秒 x 个像素。您还可以通过每帧降低velocity.y 来添加模拟重力。还有更多。基本原理保持不变。
唯一真正不同的选择是您将更新之间的增量时间考虑在内。这可确保节点随时间行进相同的距离,而与帧速率无关。这意味着如果帧速率从 60 fps 下降到 20 fps,节点仍将行进相同的距离,但每帧将多移动几个像素以弥补损失的时间。如果不考虑增量时间,节点只会随着帧速率下降而减慢。
积分增量时间是一个简单的乘法:
-(void) update:(ccTime)delta
{
self.position = ccpAdd(self.position, ccpMult(self.velocity, delta));
}
但是,大多数游戏不应该使用时间增量。它可能会导致相当不可预测的结果,包括如果设备忙碌了十分之一秒或更长时间(例如,如果它收到电子邮件或短信),游戏世界模拟中的巨大跳跃。
大多数游戏应该放慢速度,然后试图弥补“失去”的时间。问题在于,在此期间玩家无法做出更快的反应(相反),因此以比平时更快的速度推进游戏世界模拟对玩家来说是不公平的,并且可能导致过早失去四肢或生命。