loops - Cocos2D 游戏循环说明

标签 loops cocos2d-iphone game-loop

注意:我不是以英语为母语的人。请原谅任何语法错误。

我开发了一个简单的游戏,左边有一个射手,右边有敌人。非常简单。

该项目即将完成,它运行良好,但现在我对游戏循环管理有些疑问。

我安排了从右边出现的敌人,给调度器一个间隔,没关系,
但我通过一个简单的 ccMoveTo Action 管理了敌人从右到左的移动,我重复一遍:它工作得很好。
问题是我读了一些关于“在每一帧中渲染 Sprite ”的东西,将这个操作委托(delegate)给一个运行一次的预定方法
每帧..

更好:我读到不使用 Action 来移动 Sprite ,而是逐帧重新渲染它们,以以 1/60 频率(fps 频率)调用的计划方法模拟运动,我读到这种实现可以防止不同硬件系统稳定性的一些差异..

我要问的是:

  • 这是正确的方法吗?
  • 那是 Cocos2D 过时的旧“设计模式”吗? (这意味着使用 ccMoveTo 操作是完全完美的)
  • 还是两个实现在同一级别上都是正确的?

  • 编辑:

    - 动画也应该使用相同的技术吗?

    最佳答案

    首先,如果它“完美运行”并且你的游戏快结束了,不要改变你的游戏。如果你现在改变一些东西,你就会冒着对你的游戏玩法产生细微变化的风险,你的游戏将需要更长的时间才能完成,最后玩家可能甚至不会注意到差异。下次您可以尝试不同的方法,但对于您当前的游戏,只要一切顺利,就保持原样。

    我相信您所读到的也是我要说的:不要将 CCMoveTo/CCMoveBy 用于游戏对象的(复杂)移动。如果移动非常简单,或者从 A 到 B 单次移动,CCMove Action 是可以的。但即便如此,更新位置的更新循环也同样易于实现。

    CCMove Action 的问题是当您想要改变方向和/或速度时它们的行为。在这种情况下,您必须创建一个新的移动操作。如果你经常这样做,你会在你的游戏中添加更多的alloc/dealloc循环而不是必要的。其次,CCMove Action 在产生任何效果之前需要一帧不活动。这意味着如果您每帧都创建一个新的 CCMove Action ,那么该游戏对象实际上会被卡住并且根本不会移动。如果您不太频繁地更改它,您仍然会注意到每次对象更改速度或方向时都会出现短暂的停顿。两者都不可取。

    替代方案并不像您说的那么复杂。是的,您需要在移动的游戏对象中安排更新,如下所示:

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

    但是,大多数游戏不应该使用时间增量。它可能会导致相当不可预测的结果,包括如果设备忙碌了十分之一秒或更长时间(例如,如果它收到电子邮件或短信),游戏世界模拟中的巨大跳跃。

    大多数游戏应该放慢速度,然后试图弥补“失去”的时间。问题在于,在此期间玩家无法做出更快的 react (相反),因此以比平时更快的速度推进游戏世界模拟对玩家来说是不公平的,并且可能导致过早失去四肢或生命。

    关于loops - Cocos2D 游戏循环说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10759684/

    相关文章:

    php - 从 for 循环创建 PHP 下拉菜单?

    python - 在 Python 中从 1 循环到无穷大

    iphone - Box2d SetLinearVelocity 不适用于重力

    iphone - Objective-C 中的字符串比较与类比较

    c++ - MD5动画和游戏循环

    ruby-on-rails - Rspec:测试循环数组,输入 = [],自定义类的输出 =[]。 ruby

    java - Android继续循环动画

    iphone - Cocos2d 不使用 iphone 5 的整个屏幕

    objective-c - cocos2d开发游戏内存问题

    java - 如何在Java中设置固定时间步长