Cocos2d iphone 使用Box2D的简单二维飞行物理

Cocos2d iphone 使用Box2D的简单二维飞行物理,cocos2d-iphone,box2d,game-physics,Cocos2d Iphone,Box2d,Game Physics,我正试图建立一个简单的侧面滚动与飞机的球员。因此,我想建立简单的飞行控制与简单但现实的感觉物理。我正在使用cocos2D和Box2D。我有一个基本的系统在工作,但就是不能让物理感觉正确 我根据用户的输入向平面(这是一个b2CircleShape)施加力。因此,基本上,如果用户向上推,就会调用body->ApplyForce(b2Vec2(10,30),body->GetPosition())。同样,对于down-30也使用 这起作用,飞机随着上/下方向飞行,导致其俯冲或爬升。但感觉不太对劲。攀登

我正试图建立一个简单的侧面滚动与飞机的球员。因此,我想建立简单的飞行控制与简单但现实的感觉物理。我正在使用cocos2D和Box2D。我有一个基本的系统在工作,但就是不能让物理感觉正确

我根据用户的输入向平面(这是一个
b2CircleShape
)施加力。因此,基本上,如果用户向上推,就会调用
body->ApplyForce(b2Vec2(10,30),body->GetPosition())
。同样,对于down-30也使用

这起作用,飞机随着上/下方向飞行,导致其俯冲或爬升。但感觉不太对劲。攀登时不会减速,跳水时也不会加速。我的简单解决方案是非常简单的

我怎样才能对飞机攀爬/跳水有更好的感觉

我同意:

float engineForce(/* possibly some params */)
{
    return SOME_CONSTANT;
}

float airResistance(float velocity /* possibly more params */)
{
    return CFT * velocity;
}

float resultForce = std::max(engineForce() - airResistance(), 0);

使用这种方法,您可以轻松地调整系统,使用两种功能

我最终简化了飞行中应用的基本力:即推力、阻力、升力和重力

我做了以下简化:

  • 阻力和推力不需要是两个力,相反,推力的大小由当前速度调整(类似于安德鲁关于空气阻力的建议)
  • 重力由box2d中的世界对象处理
  • 升力相等,但与重力相反(当飞机水平飞行时)
  • 推力和升力是基于飞机的角度设置的:基于机身的变换R柱
  • 现在,用户只控制飞机的角度,然后调整推力和升力,并更新世界模拟


    这给了模拟一个很好的感觉,但大大简化了。

    在不知道Box2D的
    ApplyForce
    实际工作原理的情况下,您是否尝试过使所施加的力与当前速度成比例(记住方向)?所以,如果你不往上爬,你爬得比你往上爬并且想爬的时候慢?干得好。足够简单,但不太简单。