2010-03-21 91 views
3

我在做一个小小的iphone游戏,我会得到一些线索。 让我们想象一下:用Cocos2D制作动画的好方法?

两个背景精灵从右到左相当快速移动,并和上下移动与加速度计。

我想我不能在这里使用动画,使背景的运动在每一帧被重新计算。 于是我就用一个时间表与0.025s的间隔,并在每个时钟移动我的精灵有:

sprite.position = ccp(x, y); 

因此,这里是我的问题:结果是laggy,只有这两个精灵。

我试图在头两个声明的精灵,并让他们与CCNodes和标签。这是完全一样的。

所以,如果有人可以给我什么是做到这一点的最好办法一个提示,那将是多好啊。我不知道这个问题是不是精子移动速度非常快的事实,但我不确定。

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

J.

回答

3

0.025等于40帧,这可能是取决于你的游戏循环的其余部分有点陡峭。考虑帧率和流畅速度之间的关系是很好的。当你增加帧率时,你可以使运动更平滑,但只要你知道如何计算运动。如果将对象移动一段固定距离的时间,他们会口吃,因为定时器不精确。 (想一想: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帧/秒的期望帧率,您希望每帧保持在20毫秒以下,所以您知道自己是一帧“迟到”。因此,correction将为0.04/0.02 = 2,通常的移动步骤将乘以2来弥补滞后。现在您可以根据需要更改帧速率 - 运动的速度将保持不变,只有运动的平滑度会发生变化。

<voice class="Simon Peyton Jones">这有道理吗? </voice>

有一个great article about game loops你可以在这里更详细地阅读。这是游戏程序员必读的内容。在Cocos2D中实现所有这些的确切方法可能会有所不同,但重点仍然相同。解决这个问题应该可以帮助你让事情平稳快速地进行。

+0

很好的 “滴答” 功能的变化。你明确了自己,我现在看到了我必须领导的地方。 这篇文章确实非常有用。 谢谢! – 2010-03-22 01:57:02

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); 
}