2

連続的に移動するキネマティックボディ タイプのプレーン スプライトを作成します。それで、私は体に線速度を設定しました。それが、体が連続的に動く理由です。しかし、私はスクリーン境界屋根、地面、左壁、右壁を持っています。それらはすべて静的な体です。平面が移動するとき、境界壁と衝突しません。その後、 Box-2d のマニュアルを 調べたところ、キネマティック ボディは他のキネマティック ボディスタティック ボディと決して衝突しないことがわかりました。そのため、壁をキネマティックまたは静的ボディに設定しても、平面と衝突しません。壁を動的に設定すると、重力によって壁が倒れます。では、飛行機と壁の間に衝突を設定するにはどうすればよいですか?

コードは次のとおりです。

private void initializePlaneAndBoundary() {

        /*
         * create wall boundary
         */
        final Rectangle ground = new Rectangle(0, camera_Height - 2,
                camera_Width, 2, vbom);
        final Rectangle roof = new Rectangle(0, 0, camera_Width, 2, vbom);
        final Rectangle left = new Rectangle(0, 0, 2, camera_Height, vbom);
        final Rectangle right = new Rectangle(camera_Width - 2, 0, 2,
                camera_Height, vbom);

        final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0,
                0.5f, 0.5f);
        PhysicsFactory.createBoxBody(this.mPhysicsWorld, ground,
                BodyType.StaticBody, wallFixtureDef);
        PhysicsFactory.createBoxBody(this.mPhysicsWorld, roof,
                BodyType.StaticBody, wallFixtureDef);
        PhysicsFactory.createBoxBody(this.mPhysicsWorld, left,
                BodyType.StaticBody, wallFixtureDef);
        PhysicsFactory.createBoxBody(this.mPhysicsWorld, right,
                BodyType.StaticBody, wallFixtureDef);

        attachChild(ground);
        attachChild(roof);
        attachChild(left);
        attachChild(right);


        aPilot = new Pilot(222, 333, pilotTexures, vbom) {
            @Override
            protected void onManagedUpdate(float pSecondsElapsed) {

                super.onManagedUpdate(pSecondsElapsed);

            }
        };
        pilotBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, aPilot,
                BodyType.KinematicBody, FIXTURE_DEF);
        this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(
                aPilot, pilotBody, true, true));
        pilotBody.setLinearVelocity(DEMO_VELOCITY_X, DEMO_VELOCITY_Y);
        attachChild(aPilot);

    }
4

1 に答える 1

5

2 つの方法があります。

  1. キネマティックの代わりにダイナミック ボディを使用します。体を動かすには、gravityScale をゼロに設定し、速度を設定して移動するか、b2MotorJoint、b2MouseJoint などを使用します。
  2. キネマティック ボディが本当に必要で、グラウンドとの接触をキャッチしたい場合 (たとえば、コンタクト リスナーを設定することによって)、b2WeldJoint を介してこのキネマティック ボディに別のダイナミック ボディをアタッチする必要があります。そうすれば、この動的な体の接触を聞いて、思い通りに反応することができます。
于 2013-07-17T12:40:22.090 に答える