2014-12-27 12 views
0

我正在玩CocosSharp中的box2d。我確實有一個問題 - 物體移動速度太慢!儘管有很大的價值...儘管箱子裏有巨大的重力,但運動速度太慢

// Physics 
    public const float GRAVITY = -99999999999999999999999999999f; 
    public const int PTM = 32; 
    public const float ROCKET_MASS = 10000f; 
    public const float TIMESTEP = 1f/240f;  

請注意,我已更改時間步。我曾嘗試過使用質量,但它讓人感到絕望!

// Add rocket's physics 
     var def = new b2BodyDef(); 
     def.allowSleep = true; 
     def.position = new b2Vec2(0.0f, 0.0f); 
     def.type = b2BodyType.b2_dynamicBody; 

     body = world.CreateBody (def); 
     // body.Mass = Globals.ROCKET_MASS; 
     body.SetActive(true); 

     b2PolygonShape bodyBox = new b2PolygonShape(); 
     bodyBox.SetAsBox(0.1f , 0.5f); // ! 

     b2FixtureDef bodyFixture = new b2FixtureDef(); 
     bodyFixture.shape = bodyBox; 
     bodyFixture.density = 0.5f; 
     bodyFixture.friction = 0.4f; 

     body.CreateFixture(bodyFixture);  

這是我如何初始化物理:

void InitPhysics() 
    { 
     // Init the world 
     var gravity = new b2Vec2 (0.0f, Globals.GRAVITY); 
     world = new b2World (gravity); 

     world.SetAllowSleeping (true); 
     world.SetContinuousPhysics (true); 

     // Now init the ground 
     new Ground(world); 
    }  

這是我的渲染代碼:

private void StartScheduling() 
    { 
     Schedule(t => 
      { 
       if(t <= Globals.TIMESTEP) 
        timeAccumulator += t; 
       else 
        timeAccumulator += Globals.TIMESTEP; 

       while (timeAccumulator >= Globals.TIMESTEP) 
       { 
        world.Step(Globals.TIMESTEP, 6, 2); 
        timeAccumulator -= Globals.TIMESTEP; 

        // If touched, then do apply force 
        if (touch) 
        { 
         rocket.body.ApplyLinearImpulse(new b2Vec2(0f, 10000f), b2Vec2.Zero); 
        } 

        world.DrawDebugData(); 

        rocket.UpdateRocketPosition(); 
       } 

       world.ClearForces(); 
      }); 
    }  

我太累了吧,請大家幫忙!火箭必須快速落下,但它不會!

+0

http://www.iforce2d.net/b2dtut/gotchas#speedlimit – iforce2d

+0

@ iforce2d我如何能降低物體在Box2D的全球規模,但保存它的可見大小(我有480×800屏幕)? –

+0

對於PTM – iforce2d

回答

0

感謝@ iforce2d。

解決方法是在將結果呈現在屏幕上時用PTM調整box2d單位。至於我,我不明白,box2d世界是非常小的東西,並不取決於設備的屏幕大小,我應該乘以它(擴大)的渲染。現在,它的工作原理相當不錯:

public void UpdateRocketPosition() 
    { 
     // PositionX, Y are sprite's positions 
     PositionX = body.Position.x * Globals.PTM; 
     PositionY = body.Position.y * Globals.PTM; 
    }