Cocos2D逼真的重力?

Sim*_*iwi 1 gravity cocos2d-iphone ios

我已经尝试了许多不同的技术,在我的游戏中应用逼真的重力特征但到目前为止没有运气.我计划为那些可以向我展示或(分享)一些将重力应用于Cocos2D中的CCSprite的代码的人提供100点奖励.

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

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

谢谢!

Ken*_*Toh 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
}
Run Code Online (Sandbox Code Playgroud)

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

接下来是欧拉的关键.每时每步:

  1. 通过加速度(这是你的重力)乘以dt来提高你的速度,找到你的新速度.
  2. 通过新计算的速度值乘以dt来提升您的位置,以找到您的新位置.

您可以尝试是否使用delta-time(请参阅LearnCocos2D对使用它的优点的优秀评论)适用于您的游戏.虽然乘以delta时间可以让你的对象运动更准确地考虑到不同的帧速率,正如LearnCocos2d指出的那样,避免在系统中断的实时游戏中使用它(新邮件,低电量,广告流行)可能是明智的-out)可以发生并随后使游戏模拟向前跳跃以试图弥补.

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

条件提示:要应用一个脉冲来移动精灵(比如通过滑动),你可以通过改变velocity_x(如果有的话)和velocity_y的值来直接影响速度.

我在游戏中使用过这种方法,效果很好.希望能帮助到你.

  • 我想补充一点,这也可以在不增加delta时间的情况下工作.您可能希望避免增量时间,因为帧速率的任何下降都会使对象以相同的速度移动,但播放器必须更快地对更改做出反应,并且可能由于较低的帧速率而无法实现.还有副作用,例如,如果后台进程阻塞CPU 0.2秒,模拟会向前跳跃很多.再一次,这很容易杀死玩家,因为它是出乎意料的.就个人而言,我更喜欢通过不使用dt时间来降低整个游戏模拟的速度. (2认同)