Box2d: максимально возможная линейная скорость? - PullRequest
8 голосов
/ 05 апреля 2010

Я думаю, что я настроил Box2d на какую-то максимальную скорость для любого тела, но я не уверен. Я применяю импульс наподобие (100000000, 100000000), и тело движется так же быстро, как (100, 100) - что вовсе не так быстро.

Я использую порт Box2d XNA C #.

Моя игра сверху вниз.

Вот некоторый код, который может иметь отношение:

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

     //...
        }

Вот пример кода, который применяет импульс:

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

Если Constants.PLAYER_IMPULSE_CONSTANT находится в диапазоне от 1000f до 1000000000f, игрок может перемещаться не более (-120, -120) до (120, 120). Если константа меньше, например 1f, игрок будет двигаться медленнее.

Этот код используется для настройки физики всего в игровом мире:

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

Может ли быть линейное затухание? Я изменил его с 10.0f на 0, без эффекта.

ОБНОВЛЕНИЕ: Странность с линейным демпфированием: я сделал эти наблюдения на теле, которое перемещается с помощью метода применения импульса выше:

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

Почему существует диапазон чувствительности линейного демпфирования между 50f и 60f?

Ответы [ 2 ]

15 голосов
/ 29 декабря 2010

Это не способ решить эту проблему.Вы должны уменьшить свои объекты при создании их в мире box2D.Затем вы можете просто масштабировать информацию, которую box2D возвращает вам в размер вашего мира.

Скажем, например, что у меня в мире коробка длиной 120 пикселей.Если бы я уменьшил объект в 30 раз, чтобы он мог правильно смоделировать box2d, тогда длина моего блока в мире box2D составила бы 4 пикселя (120/30 или размер вашего объекта / масштаба).Теперь предположим, что box2D вычисляет, что мой ящик переместился на 3 "пикселя" в мире box2d.Затем я мог бы получить эту информацию и масштабировать ее до размера моего мира, что означало бы, что коробка просто переместилась на 90 пикселей (3 * 30).Надеюсь, это не слишком запутанно.Мне обычно трудно объяснить себя.

3 голосов
/ 06 апреля 2010

У меня такая же проблема с версией 2.1a я узнал, что изменение строки 128 в b2Settings.as может помочь. Измените static public const b2_maxTranslation: Number = 2.0 на большее число. уверен, что это не правильный путь, но сейчас действительно не знаю, как это сделать правильно.

...