0

我有关于空中速度的问题。

当我同时跳跃和移动时,玩家的时间速度会增加。我使用冲动进行跳跃,我使用力量进行移动。我想知道当玩家在空中时如何减慢速度。

这是我左右移动的代码

-(void)update:(ccTime)dt :(b2Body *)ballBody :(CCSprite *)player1 :(b2World *)world
{

    if (moveRight.active==YES) 
    {   
  //      maxSpeed=10.0f;
            ballBody->SetActive(true);
    //    b2Vec2 locationworld=b2Vec2(maxSpeed,0);
        double mass=ballBody->GetMass();
        ballBody->ApplyForce(mass*locationworld, ballBody->GetWorldCenter());
        ballBody->SetLinearDamping(1.2f);
    }
    else if(moveLeft.active==YES)
    {
            ballBody->SetActive(true);
        b2Vec2 locationworld=b2Vec2(-10,0);
        double mass=ballBody->GetMass();
        ballBody->ApplyForce(mass*locationworld, ballBody->GetWorldCenter());
    //    ballBody->SetLinearDamping(1.2f);

    }
}

以下是跳跃玩家

-(void)jump:(b2Body*)ballBody:(ccTime)dt:(BOOL)touch
{
    if (touch) 
    {

        if (jumpSprte.active==YES) 
        {
            ballBody->SetActive(true);
            b2Vec2 locationWorld;
            locationWorld=b2Vec2(0,25);
            ballBody->ApplyLinearImpulse(locationWorld, ballBody->GetWorldCenter());

        }
    }
}

那么我在哪里使用逻辑?

提前致谢

4

2 回答 2

1

您需要模拟空气阻力以减慢玩家在空中的速度。有几种方法可以做到这一点,具体取决于您希望模拟的真实程度。对于一个简单的模型linearDampening会减慢它的速度。

真正的空气阻力不是线性的。要以更现实的方式对此进行建模,您需要使用以下内容:

F = - C * v * |v| 
  • F是空气阻力的总力
  • C是一个取决于物体形状的阻力常数
  • v是速度矢量(|v|如果您愿意,是速度的大小或长度)

听起来你的玩家也可以在空中使用移动来提高他们的速度。这是因为你允许玩家在他的腿不接触地面时施加力量。如果这是您的目标,为了避免这种情况,请确保当角色接触地面时是唯一可以施加更大力使他移动的时间。

请注意,这在很大程度上取决于您希望这是哪种游戏。如果它在为游戏制作物理时看起来和感觉都很好,那就太好了。如果您无法对现实进行完全准确的模拟,请不要紧张,只要最终结果表现良好即可。

于 2012-09-05T06:30:13.657 回答
0

这是我左右移动的代码

-(void)update:(ccTime)dt :(b2Body *)ballBody :(CCSprite *)player1 :(b2World *)world
{

    if (moveRight.active==YES) 
    {   
  //      maxSpeed=10.0f;
            ballBody->SetActive(true);
    //    b2Vec2 locationworld=b2Vec2(maxSpeed,0);
        double mass=ballBody->GetMass();
        ballBody->ApplyForce(mass*locationworld, ballBody->GetWorldCenter());
        ballBody->SetLinearDamping(1.2f);
    }
    else if(moveLeft.active==YES)
    {
            ballBody->SetActive(true);
        b2Vec2 locationworld=b2Vec2(-10,0);
        double mass=ballBody->GetMass();
        ballBody->ApplyForce(mass*locationworld, ballBody->GetWorldCenter());
    //    ballBody->SetLinearDamping(1.2f);

    }
}

以下是跳跃玩家

-(void)jump:(b2Body*)ballBody:(ccTime)dt:(BOOL)touch
{
    if (touch) 
    {

        if (jumpSprte.active==YES) 
        {
            ballBody->SetActive(true);
            b2Vec2 locationWorld;
            locationWorld=b2Vec2(0,25);
            ballBody->ApplyLinearImpulse(locationWorld, ballBody->GetWorldCenter());

        }
    }
}

那么我在哪里使用逻辑?

于 2012-09-05T06:50:43.083 回答