使用Cocos2D制作动画的好方法?

时间:2010-03-21 17:43:56

标签: iphone performance animation cocos2d-iphone

我正在做一个小小的iphone游戏,我会得到一些线索。 让我们想象一下:

两个背景精灵从右向左快速移动,并使用加速度计上下移动。

我想我不能在这里使用动画,因为每帧都会重新计算背景的移动。 所以我使用间隔为0.025s的时间表,并在每个时钟移动我的精灵:

sprite.position = ccp(x, y);

所以这是我的问题:结果是滞后的,只有这两个精灵。

我尝试在标题中声明精灵,并使用CCNodes和Tags获取它们。它完全一样。

所以,如果有人能给我一个提示,告诉我最好的方法是什么,那就太好了。我想知道这个问题是不是精灵快速移动的事实,但我不确定。

无论如何,谢谢你的时间。

学家

2 个答案:

答案 0 :(得分:3)

0.025等于40 fps,这可能有点陡峭,具体取决于游戏循环的其余部分。考虑帧速率和感知速度之间的关系是很好的。增加帧速率时,只要知道如何计算运动,就可以使运动更平滑。如果您使用时间的每个刻度移动固定距离的对象,它们将会断断续续,因为计时器不精确。 (想一想:40 fps意味着每帧25 ms。当计时器下降5毫秒 - 不是很多,是吗? - ,你将帧时间改变了20%。时间事件得到的并不罕见关闭10-20毫秒。)

这意味着您必须从最后一帧计算实时增量并根据它移动对象。有点像这样:

const int kDesiredModelFramerate = 50; // fps
const double kDesiredFrameTime = 1.0/kDesiredModelFramerate;

double now = CFAbsoluteTimeGetCurrent();
double delta = now - lastFrameTime;
double correction = delta/kDesiredFrameTime;
[object setX:object.x + step*correction];

这看起来很复杂,但事实并非如此。当从最后一帧花费40毫秒时,你知道你是一帧“迟到”,因为要保持所需的帧速率为50 fps,你希望每帧保持在20毫秒以下。因此correction将为0.04 / 0.02 = 2,并且通常的移动步骤将乘以2以弥补滞后。现在你可以根据需要改变帧速率 - 运动的速度将保持不变,只有运动的平滑度会发生变化。

<voice class="Simon Peyton Jones">这有意义吗?</voice>

有一个great article about game loops,您可以在这里详细了解这一点。这是游戏程序员必读的内容。在Cocos2D中实现所有这些的确切方法可能会有所不同,但重点仍然相同。获得此问题应该可以帮助您顺利,快速地完成工作。

答案 1 :(得分:1)

如果你正在使用Cocos2D并且需要从“游戏”开始查找经过的时间,最好使用time_elapsed,如下所示。我尝试过的许多其他方法都会返回一个非常高值的DOUBLE变量,这会导致双倍到浮点转换精度的问题。

在Cocos2D CCLayer场景中的“勾号”功能中进行更改

-(void) tick: (ccTime) dt
{
  static float time_elapsed = 0.0;
  time_elapsed += dt;

  ...

  float velocity = 5.0f * cosf(time_elapsed * 2 * M_PI) ;
  jPrism->SetMotorSpeed( velocity );
}