1

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

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

无论如何,任何人都可以提供一些技巧/想法或他们的方法,只将重力应用于 Cocos2D 中的 CCSprite而不使用物理引擎?

谢谢!

4

2 回答 2

5

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

// 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
}

在上面的代码片段中,我定义了一个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 的值直接影响速度。

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

于 2012-07-14T06:55:45.440 回答
0

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

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

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

Step 1, calculate the effective direction vectors Step 2, calculate velocity Step 3, project this velocity onto the two effective directions. Step 4, generate an equal and opposite force for the two direction and call this the “response force”.

于 2012-07-20T08:39:44.997 回答