【问题标题】:What's wrong with my Gravity?我的重力怎么了?
【发布时间】:2012-08-05 03:47:10
【问题描述】:

我最近刚刚在我的应用中实现了重力,但是我无法让它正常工作。每当我执行我的代码时,我的游戏中的角色会立即下降,就好像我在设置它的位置而不是施加重力一样。

所以我的游戏循环中有以下代码(dTime 也是我的游戏循环的增量时间):

float fVelocity = 0;
fVelocity -= GRAVITY * dTime;
velocity += fVelocity * dTime;
pos.y = clampf(velocity, -MAXSPEED, MAXSPEED);

那么重力和MAXSPEED的定义如下:

#define GRAVITY 100
#define MAXSPEED 500

那么这里有什么看起来错误的东西可能导致这个问题吗?

谢谢!

【问题讨论】:

    标签: ios cocos2d-iphone ccsprite gravity


    【解决方案1】:

    您正在设置位置而不是速度。您没有显示定义“速度”变量的位置,但我假设它从零开始。如果要按照自己的方式进行操作,则需要使用精灵的实际位置对其进行初始化,但是您可能应该尝试以不同方式定义每个变量以使其更易于理解的方法。

    -- Inside you setup --
    float acceleration = 0;
    float velocity = 0
    float positionY = 100;
    
    -- Inside your update --
    acceleration += -GRAVITY * dT;
    velocity += acceleration * dT;
    positionY += velocity * dT;
    

    我没有包括夹子,但你可以夹到任何你想要的东西。

    作为旁注,有些人不喜欢将他们的变量与 dT 相乘,因为如果你有一个帧率下降,玩家会移动非常大的量,这使得玩需要精确计时的游戏变得非常困难。如果你不与 dT 相乘,那么物理会滞后于游戏。

    【讨论】:

    • 其实就是这样。我刚刚注意到 position.y =velocity, 应该是 +=.
    • 为了提供更多上下文,我的速度变量在我的 CCLayer 类的 .h 中声明。速度不是恒定的(显然),所以它应该随着时间的推移而增加。 pos.y 是我的 CCSprite 的当前 position.y 位置。希望这有助于提供更多信息!
    • 我的答案仍然与新信息相同。如果您单步执行您的代码并假设 dT 为 1,您将看到速度将等于 -100,然后您将位置设置为该速度。这就是它跳出屏幕底部的原因
    • 好的,谢谢,我会更多地查看这个答案。另外,我使用固定的时间步长,所以我不必担心任何滞后!
    • 也不是:加速度 += -GRAVITY * dT; = 加速度 -= 重力 * dT; ?
    【解决方案2】:

    每帧 500 像素的最大速度太高了。考虑尝试使用较低的重力和最大速度值(例如 10 重力,50 最大速度)的算法,然后根据您所看到的进行调整。

    【讨论】:

    • 感谢您的回复,但是即使我将重力设为 0.1 和 maxspeed 50,也会发生同样的事情
    猜你喜欢
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多