【问题标题】:Good way to make animations with Cocos2D?用 Cocos2D 制作动画的好方法?
【发布时间】:2010-03-21 17:43:56
【问题描述】:

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

两个背景精灵从右到左快速移动,并随着加速度计上下移动。

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

sprite.position = ccp(x, y);

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

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

因此,如果有人可以提示我什么是最好的方法,那就太好了。我想知道问题是不是精灵移动得很快,但我不确定。

无论如何,感谢您的宝贵时间。

J.

【问题讨论】:

    标签: iphone performance animation cocos2d-iphone


    【解决方案1】:

    0.025 等于 40 fps,这可能会有点陡峭,具体取决于游戏循环的其余部分。考虑一下帧率和感知速度之间的关系是件好事。当您增加帧速率时,您可以使运动更平滑,但前提是您知道如何计算运动。如果您在时间的每个滴答声中将对象移动一个固定的距离,它们会结结巴巴,因为计时器不精确。 (想一想:40 fps 意味着每帧 25 毫秒。当计时器关闭 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 中实现这一切的确切方法可能会有所不同,但要点是一样的。收到此问题应该可以帮助您顺利、快速地进行。

    【讨论】:

    • 很好。你把自己说清楚了,我现在明白了我必须领导的地方。这篇文章确实很有帮助。谢谢!
    【解决方案2】:

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

    修改Cocos2D CCLayer场景中的“tick”功能

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多