【问题标题】:Cocos2D Realistic Gravity?Cocos2D 现实重力?
【发布时间】:2012-07-14 06:26:04
【问题描述】:

我尝试了许多不同的技术来在我的游戏中应用逼真的重力功能,但到目前为止都没有成功。我计划为此提供 100 分的赏金,以便有人可以向我展示或(分享)一些将重力应用于 Cocos2D 中的 CCSprite 的代码。

到目前为止,我所做的只是丑陋或不切实际,我在许多不同的地方询问过最好的方法是什么,但我还没有找到任何好看的重力技术。

无论如何,谁能提供一些提示/想法或他们的方法,只在 Cocos2D 中使用物理引擎将重力应用于 CCSprite?

谢谢!

【问题讨论】:

    标签: ios cocos2d-iphone gravity


    【解决方案1】:

    无需显式使用任何物理引擎的有效方法是在更新循环中手动调整精灵的速度和位置。这本质上是欧拉积分。

    // define your gravity value
    #define GRAVITY -0.1
    
    // define a velocity variable in the header of your Game class/CCSprite Subclass (neater)
    float velocity_y;
    
    -(void) update: (ccTime) dt
    {
        // Step the y-velocity by your acceleration value (gravity value in this case)
        velocity_y += GRAVITY *dt; // drop the dt if you don't want to use it 
    
        // Step the position values and update the sprite position accordingly
        sprite.position.y += velocity_y* dt; // same here
    }
    

    在上面的代码 sn-p 中,我定义了一个velocity_y 变量来跟踪我的精灵沿y 方向的当前速度。请记住在您的 init 方法中将此值初始化为 0。

    接下来是欧拉的症结所在。在每个时间步:

    1. 将你的速度乘以你的加速度(即你的重力)乘以 dt 来找到你的新速度。
    2. 通过新计算的速度值乘以 dt 来推进您的位置,以找到您的新位置。

    您可以试验是否使用 delta-time(请参阅 LearnCocos2D 关于使用它的缺点的出色评论)是否适用于您的游戏。正如 LearnCocos2d 指出的那样,虽然乘以 delta-time 可以让您的对象运动更准确地考虑变化的帧速率,但避免在系统中断(新邮件、电池电量不足、广告弹出)的实时游戏中使用它可能是明智之举-out) 可能会发生并随后导致游戏模拟向前跳跃以尝试弥补。

    因此,如果您要降低 dt,请记住相应地调整(缩小)您的 GRAVITY 值以保持正确的感觉,因为该值不再乘以 delta-time 的值(约为 1/60) .

    附加提示:要应用脉冲来移动精灵(例如通过滑动),您可以通过更改velocity_x(如果有的话)和velocity_y 的值直接影响速度。

    我在我的游戏中使用了这种方法,并且效果很好。希望有帮助。

    【讨论】:

    • 我想补充一点,这也可以在不乘以增量时间的情况下工作。您可能希望避免增量时间,因为帧速率的任何下降都会使对象以相同的速度移动,但玩家必须更快地对变化做出反应,并且可能由于较低的帧速率而无法响应。还有副作用,例如,后台进程阻塞 CPU 0.2 秒,模拟向前跳跃大量。同样,这很容易杀死玩家,因为它是出乎意料的。就我个人而言,我更喜欢通过不使用 dt 时间来减慢整个游戏模拟的速度。
    • @Kentoh 您能否编辑您的帖子,使其包含 LearnCocos2D 提供的提示?到目前为止,您的代码看起来很棒,但我希望它尽可能没有错误!
    • 您能否展示您如何在 .h 中声明这些变量并删除速度 X,因为我只需要 Y 值? :P
    • 更新:我添加了 100 点的赏金。如果@LearnCocos2D 知道如何正确应用重力,请随时添加它作为答案!
    • @iBradApps,我已经更新了答案。你可以在任何地方声明velocity_y,即使在游戏类的头文件中,如果你只有一个想要应用重力的精灵。否则,您可能希望继承 CCSprite,并将其添加为成员,以便您可以执行 mysprite.velocity_y 示例。希望这会有所帮助。
    【解决方案2】:

    这不是小事,您应该尝试查看其他帖子。我敢肯定其他人已经遇到过这个问题。试试看:

    或者试试我们的好朋友谷歌:

    无论如何这里有一些提示:

    第一步,计算有效方向向量 第二步,计算速度 第 3 步,将该速度投影到两个有效方向上。 第四步,为两个方向产生一个相等且相反的力,称之为“响应力”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多