Pregunta

creo que he configurado Box2D a tener algún tipo de velocidad máxima para cualquier cuerpo, pero no estoy seguro. Aplico un impulso como (100000000, 100000000), y el cuerpo se mueve tan rápido como (100, 100) -. Que no es tan rápido en absoluto

Estoy usando el puerto Box2D XNA C #.

Mi juego es una de arriba hacia abajo 2d.

Aquí hay un código que puede 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);

     //...
        }

Aquí hay un código de ejemplo que se aplica el 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);
    }

Si Constants.PLAYER_IMPULSE_CONSTANT es en cualquier lugar de 1000f a 1000000000f, el jugador puede mover a lo sumo (-120, -120) a (120, 120). Si la constante es menor, al igual que 1f, el jugador se mueva más lentamente.

Este código se utiliza para configurar la física para todo en el mundo del juego:

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

¿Podría ser el amortiguamiento lineal? He cambiado de 10.0f a 0, sin efecto.

UPDATE: Weirdness con amortiguamiento lineal: He hecho estas observaciones en el cuerpo que se mueve con el aplicar el método de impulso anterior:

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

¿Por qué hay un rango de sensibilidad de amortiguamiento lineal entre 50f y 60f?

¿Fue útil?

Solución

Tengo el mismo problema con la versión 2.1a me enteré de que el cambio de la línea 128 en b2Settings.as puede ayudar. Cambio estática const pública b2_maxTranslation: Number = 2.0 a un número más alto. Seguro que esto no es el camino correcto, pero en este momento no sé realmente cómo hacerlo correctamente.

Otros consejos

Esa no es la manera de solucionar ese problema. Se supone que reducir sus objetos al crear ellos en el mundo Box2D. A continuación, sólo puede escalar la información que Box2D le da de nuevo al tamaño de su mundo.

Vamos a decir por ejemplo, que una caja en mi mundo es de 120 píxeles de largo. Si escalé el objeto por 30 veces de modo que pueda ser simulado por Box2D adecuadamente, entonces la longitud de mi caja en el mundo Box2D sería de 4 "píxeles" de largo (120/30 o el tamaño de su objeto / escala). Ahora, digamos que Box2D calcula que mi caja se movió 3 "píxeles" en el mundo Box2D. Entonces podría tomar esa información y volverla a subir al tamaño de mi mundo lo que significaría que la caja se acaba de mudar 90 píxeles (3 x 30). Espero que no suene demasiado confuso. Por lo general resulta difícil de explicar a mí mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top