2

我有一个借助按钮移动的身体,这就是我正在做的事情:

-(void) step: (ccTime) delta
{
  int steps = 2;
  CGFloat dt = delta/(CGFloat)steps;

  for(int i=0; i<steps; i++){
    cpSpaceStep(space, dt);
  }
  cpSpaceHashEach(space->activeShapes, &eachShape, nil);
  cpSpaceHashEach(space->staticShapes, &eachShape, nil);


  if(MoveBody)  
  {     
    cpFloat movementPadding = 0.1;
    cpBodyApplyForce(body, 
    cpvmult(ccp( 10, 0), movementPadding), cpvzero);   
  }
  else
    cpBodyResetForces(body);
}

我只想在条件失败时停止身体移动。我正在尝试将所有力量重置为 0cpBodyResetForces(body),但这永远不会起作用 - 它只是继续移动。

我怎样才能阻止身体移动?

4

2 回答 2

1

如果你读过一些基本的物理学,你会记得通过简单地将所有力重置为零 - 如果没有摩擦 - 身体将继续永远移动。您需要做的是要么在身体移动的空间中增加摩擦力,要么消除原始力并朝相反方向施加力,直到身体停止 - 然后消除所有力。

使用物理引擎可能有一种非常有效的方法来做到这一点,但我只是自己学习所有这些 - 希望这会有所帮助!

干杯!

于 2011-03-22T03:54:01.080 回答
0

物体继续运动的原因是由于它的动量。要让对象“自动”停止,您需要将空间阻尼设置为大于 0。来自文档:

> cpFloat cpSpaceGetDamping(const cpSpace *space) void
> cpSpaceSetDamping(cpSpace *space, cpFloat value) 

应用于空间的简单阻尼量。值 0.9 意味着每个物体每秒将损失 10% 的速度。默认为 1。就像重力一样,可以在每个身体的基础上覆盖。

于 2014-02-18T14:57:07.323 回答