Question

Je pense que je l'ai configuré Box2d d'avoir une sorte de vitesse maximale pour tout le corps, mais je ne suis pas sûr. J'applique une impulsion comme (100000000, 100000000), et le corps se déplace aussi vite que (100, 100) -. Qui est pas rapide du tout

J'utilise le port Box2d XNA C #.

Mon jeu est un top-down 2d.

Voici un code qui peut être pertinent:

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

     //...
        }

Voici quelques exemples de code qui applique l'impulsion:

    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 est partout de 1000f à 1000000000f, le joueur peut se déplacer au plus (-120, -120) à (120, 120). Si la constante est moins, comme 1f, le joueur se déplace plus lentement.

Ce code est utilisé pour mettre en place la physique pour tout dans le monde du jeu:

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

Serait-il possible l'amortissement linéaire? Je l'ai changé de 10.0f à 0, sans effet.

Mise à jour: Weirdness avec un amortissement linéaire: J'ai fait ces observations sur le corps qui se déplace avec la méthode appliquer l'impulsion ci-dessus:

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

Pourquoi est-il une plage de sensibilité linéaire d'amortissement entre 50f et 60f?

Était-ce utile?

La solution

J'ai le même problème avec la version 2.1a j'ai découvert que le changement de la ligne 128 en b2Settings.as peut aider. Changer const b2_maxTranslation public static: Number = 2.0 à un plus grand nombre. sûr que ce n'est pas la bonne façon, mais maintenant ne sais pas vraiment comment le faire correctement.

Autres conseils

Ce n'est pas la façon de résoudre ce problème. Vous êtes censé réduire vos objets lors de leur création dans le monde Box2D. Ensuite, vous pouvez simplement l'échelle les informations que vous Box2D redonne à la taille de votre monde.

Disons par exemple qu'une boîte dans mon monde est de 120 pixels de long. Si je mis à l'échelle de l'objet par 30 fois pour qu'il puisse être simulé par box2d correctement alors la longueur de ma boîte dans le monde Box2D serait 4 « pixels » de long (120/30 ou la taille de votre objet / échelle). Maintenant, disons que Box2D calcule que ma boîte déplacé 3 « pixels » dans le monde box2d. Je pourrais alors saisir cette information et l'échelle de nouveau à la taille de mon monde qui voudrait dire que la case 90 pixels déplacé juste (3 * 30). J'espère que ne sonne pas trop confus. Je trouve souvent du mal à me expliquer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top