8

Box2d を構成して、任意のボディに対してある種の最大速度を設定したと思いますが、よくわかりません。のような衝動を加える(100000000, 100000000)と、体は と同じ速さで動きます(100, 100)が、それほど速くはありません。

Box2d XNA C# ポートを使用しています。

私のゲームはトップダウンの 2D です。

関連する可能性のあるコードを次に示します。

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ですか?

4

2 に答える 2

15

それはその問題を解決する方法ではありません。box2D ワールドでオブジェクトを作成するときは、オブジェクトを縮小することになっています。次に、box2D が提供する情報を元の世界のサイズにスケーリングできます。

たとえば、私の世界のボックスの長さが 120 ピクセルだとします。box2d で適切にシミュレートできるようにオブジェクトを 30 倍に縮小した場合、box2D の世界でのボックスの長さは 4 "ピクセル" になります (120 / 30 またはオブジェクトのサイズ / スケール)。ここで、box2D が、私のボックスが box2d ワールドで 3 "ピクセル" 移動したと計算するとします。次に、その情報を取得して、元の世界のサイズに戻すことができました。これは、ボックスが 90 ピクセル (3 * 30) だけ移動したことを意味します。あまり混乱しないように聞こえたことを願っています。私は通常、自分自身を説明するのが難しいと感じています。

于 2010-12-29T18:25:25.090 に答える
3

バージョン 2.1a でも同じ問題があり、b2Settings.as の 128 行目を変更すると解決することがわかりました。static public const b2_maxTranslation:Number = 2.0 をより大きな数値に変更します。これが正しい方法ではないことは確かですが、今のところ、正しく行う方法がわかりません。

于 2010-04-05T22:11:03.153 に答える