2014-12-27 7 views
0

Я играю с box2d в 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;  

Обратите внимание, что я изменил timestep. Я пытался использовать массу, но это совершенно бессмысленно!

// 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); 
    }  

И это мой Renderer код:

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 мире, но сохранение его видимый размер (я имею 480x800 экран)? –

+0

Используйте другое значение для PTM – iforce2d

ответ

0

Благодаря @ iforce2d.

Решение заключается в настройке блоков box2d с помощью PTM при рендеринге результата на экране. Что касается меня, я не понял, что в мире box2d есть что-то очень маленькое и не зависит от размера экрана устройства, и что я должен умножить его (увеличить) на рендеринг. Сейчас он работает довольно хорошо:

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