Pergunta

Acho que configurei o Box2D para ter algum tipo de velocidade máxima para qualquer corpo, mas não tenho certeza. Eu aplico um impulso como (100000000, 100000000), e o corpo se move tão rápido quanto (100, 100) - que não é tão rápido assim.

Estou usando a porta box2d xna c#.

Meu jogo é um 2D de cima para baixo.

Aqui está algum código que pode ser relevante:

private readonly Vector2 GRAVITY = new Vector2(0, 0);

    public void initializePhysics(ContactReporter contactReporter)
    {
        world = new World(GRAVITY, true);
        IContactListener contactListener = contactReporter;
        world.ContactListener = contactListener;
    }

    public void Update(GameTime gameTime)
        {
     // ...

            worldState.PhysicsWorld.Step((float)gameTime.ElapsedGameTime.TotalSeconds, 10, 10);

     //...
        }

Aqui está algum código de exemplo que aplica o impulso:

    private void ApplyImpulseFromInput()
    {
        Vector2 movementImpulse = new Vector2();

        if (inputReader.ControlActivation(ActionInputType.MOVE_LEFT) == 1f)
        {
            movementImpulse.X = -Constants.PLAYER_IMPULSE_CONSTANT;
        } else if (inputReader.ControlActivation(ActionInputType.MOVE_RIGHT) == 1f)
        {
            movementImpulse.X = Constants.PLAYER_IMPULSE_CONSTANT; ;
        }

        if (inputReader.ControlActivation(ActionInputType.MOVE_UP) == 1f)
        {
            movementImpulse.Y = -Constants.PLAYER_IMPULSE_CONSTANT; ;
        } else if (inputReader.ControlActivation(ActionInputType.MOVE_DOWN) == 1f)
        {
            movementImpulse.Y = Constants.PLAYER_IMPULSE_CONSTANT; ;
        }

        model.Body.ApplyImpulse(movementImpulse, model.Position);
    }

Se Constants.PLAYER_IMPULSE_CONSTANT está em qualquer lugar 1000f para 1000000000f, o jogador pode se mover no máximo (-120, -120) para (120, 120). Se a constante for menor, como 1f, o jogador se moverá mais lentamente.

Este código é usado para configurar a física para tudo no mundo dos jogos:

        controller.Model.BodyDef = new BodyDef();
        controller.Model.BodyDef.type = controller.Model.Mobile ? BodyType.Dynamic : BodyType.Static;
        controller.Model.Body = worldState.PhysicsWorld.CreateBody(controller.Model.BodyDef);
        controller.Model.Body.SetLinearDamping(10.0f);

Poderia ser o amortecimento linear? Eu mudei de 10.0f para 0, sem efeito.

ATUALIZAR: Estranheza com amortecimento linear: fiz essas observações sobre o corpo que são movidas com o método Apply Impulse acima:

Linear Damping       Max Speed
0f                   120
10f                  120
50f                  120
55f                  90
60f                  0
70f                  0
100f                 0
100000f              0

Por que há uma variedade de sensibilidade no amortecimento linear entre 50f e 60f?

Foi útil?

Solução

Eu tenho o mesmo problema com a versão 2.1a, descobri que a linha de alteração 128 em B2Settings.As pode ajudar. Altere const public estático B2_MAXTRANSLATION: Número = 2,0 para um número mais alto. Claro que esse não é o caminho certo, mas agora realmente não sei como fazê -lo corretamente.

Outras dicas

Essa não é a maneira de resolver esse problema. Você deve diminuir seus objetos ao criá -los no mundo Box2D. Então você pode apenas dimensionar as informações que o Box2D devolve ao tamanho do seu mundo.

Digamos, por exemplo, que uma caixa no meu mundo tem 120 pixels de comprimento. Se eu escalasse o objeto para baixo 30 vezes para que ele possa ser simulado pelo Box2D corretamente, o comprimento da minha caixa no mundo Box2D seria de 4 pixels de comprimento (120/30 ou tamanho do seu objeto / escala). Agora, digamos que o Box2D calcula que minha caixa moveu 3 "pixels" no mundo Box2d. Eu poderia então pegar essas informações e ampliá -las para o tamanho do meu mundo, o que significaria que a caixa moveu 90 pixels (3 * 30). Espero que não pareça muito confuso. Eu geralmente acho difícil me explicar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top