2013-03-16 10 views
9

私はちょうどLibgdxのBox2d Engineで作業を始めましたが、Contactlisterのメソッドを呼び出す必要があるときは分かりません。一方では「開始連絡先」と他方の「終了連絡先」にあります。私はそれらを呼び出す必要があります、特定の什器の数を他の人に触れるには?そして、私はコンタクトリストを実装するにはどうしたらいいですか? チュートリアルへのリダイレクトは私の質問に答えるでしょう。私はGoogleを検索している間は何も見つかりませんでした。 このoneは私を大いに助けましたが、C++用に書かれており、実装をメインのgamecircleには言及していません。 私を助けるThx)libgdx contactlistenerの使い方

答えて

16

ここにlibgdxの短い例があります。 ContactListenerを作成して、連絡先が作成されたときにどの什器が関与しているかを示す方法を示します。また、world.getContactList()の使用方法を示しています。これは、物理ステップの後にまだ存在する連絡先のリストを返します。これにより、物理ステップの過程で作成され、壊れたコンタクトが失われる可能性があります。これらに興味がある場合はContactListenerを実装し、beginContact()を使用して連絡先を検出し、endContact()が壊れていることを検出する必要があります。

package hacks; 

import com.badlogic.gdx.Gdx; 
import com.badlogic.gdx.backends.lwjgl.LwjglApplication; 
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; 
import com.badlogic.gdx.graphics.GL10; 
import com.badlogic.gdx.graphics.OrthographicCamera; 
import com.badlogic.gdx.math.MathUtils; 
import com.badlogic.gdx.math.Vector2; 
import com.badlogic.gdx.physics.box2d.Body; 
import com.badlogic.gdx.physics.box2d.BodyDef; 
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; 
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; 
import com.badlogic.gdx.physics.box2d.Contact; 
import com.badlogic.gdx.physics.box2d.ContactImpulse; 
import com.badlogic.gdx.physics.box2d.ContactListener; 
import com.badlogic.gdx.physics.box2d.Fixture; 
import com.badlogic.gdx.physics.box2d.FixtureDef; 
import com.badlogic.gdx.physics.box2d.Manifold; 
import com.badlogic.gdx.physics.box2d.PolygonShape; 
import com.badlogic.gdx.physics.box2d.World; 

public class Box2DDemoMain extends com.badlogic.gdx.Game { 

    private static final float SCALING = 0.1f; 

    private Box2DDebugRenderer debugRenderer; 
    private OrthographicCamera camera; 
    private World world; 

    @Override 
    public void create() { 
     debugRenderer = new Box2DDebugRenderer(); 
     camera = new OrthographicCamera(); 

     createWorld(); 
     createCollisionListener(); 
     createGround(); 
     createBox(); 
    } 

    private void createWorld() { 
     Vector2 gravity = new Vector2(0, -10); 
     world = new World(gravity, true); 
    } 

    private void createCollisionListener() { 
     world.setContactListener(new ContactListener() { 

      @Override 
      public void beginContact(Contact contact) { 
       Fixture fixtureA = contact.getFixtureA(); 
       Fixture fixtureB = contact.getFixtureB(); 
       Gdx.app.log("beginContact", "between " + fixtureA.toString() + " and " + fixtureB.toString()); 
      } 

      @Override 
      public void endContact(Contact contact) { 
       Fixture fixtureA = contact.getFixtureA(); 
       Fixture fixtureB = contact.getFixtureB(); 
       Gdx.app.log("endContact", "between " + fixtureA.toString() + " and " + fixtureB.toString()); 
      } 

      @Override 
      public void preSolve(Contact contact, Manifold oldManifold) { 
      } 

      @Override 
      public void postSolve(Contact contact, ContactImpulse impulse) { 
      } 

     }); 
    } 

    private void createGround() { 
     PolygonShape groundShape = new PolygonShape(); 
     groundShape.setAsBox(50, 1); 
     BodyDef groundBodyDef = new BodyDef(); 
     groundBodyDef.type = BodyType.StaticBody; 
     groundBodyDef.position.set(0, -20); 
     Body groundBody = world.createBody(groundBodyDef); 
     FixtureDef fixtureDef = new FixtureDef(); 
     fixtureDef.shape = groundShape; 
     groundBody.createFixture(fixtureDef); 
     groundShape.dispose(); 
    } 

    private void createBox() { 
     PolygonShape boxShape = new PolygonShape(); 
     boxShape.setAsBox(1, 1); 
     BodyDef boxBodyDef = new BodyDef(); 
     boxBodyDef.position.set(0, 20); 
     boxBodyDef.angle = MathUtils.PI/32; 
     boxBodyDef.type = BodyType.DynamicBody; 
     boxBodyDef.fixedRotation = false; 
     Body boxBody = world.createBody(boxBodyDef); 
     FixtureDef boxFixtureDef = new FixtureDef(); 
     boxFixtureDef.shape = boxShape; 
     boxFixtureDef.restitution = 0.75f; 
     boxFixtureDef.density = 2.0f; 
     boxBody.createFixture(boxFixtureDef); 
     boxShape.dispose(); 
    } 

    @Override 
    public void resize(int width, int height) { 
     super.resize(width, height); 
     float cameraWidth = Gdx.graphics.getWidth() * SCALING; 
     float cameraHeight = Gdx.graphics.getHeight() * SCALING; 
     camera.setToOrtho(false, cameraWidth, cameraHeight); 
     camera.position.set(0, 0, 0); 
    } 

    @Override 
    public void render() { 
     super.render(); 

     world.step(Gdx.graphics.getDeltaTime(), 8, 3); 

     int numContacts = world.getContactCount(); 
     if (numContacts > 0) { 
      Gdx.app.log("contact", "start of contact list"); 
      for (Contact contact : world.getContactList()) { 
       Fixture fixtureA = contact.getFixtureA(); 
       Fixture fixtureB = contact.getFixtureB(); 
       Gdx.app.log("contact", "between " + fixtureA.toString() + " and " + fixtureB.toString()); 
      } 
      Gdx.app.log("contact", "end of contact list"); 
     } 

     Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
     Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
     camera.update(); 
     debugRenderer.render(world, camera.combined); 
    } 

    public static void main(String[] args) { 
     LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); 

     config.title = Box2DDemoMain.class.getName(); 
     config.width = 800; 
     config.height = 480; 
     config.fullscreen = false; 
     config.useGL20 = true; 
     config.useCPUSynch = true; 
     config.forceExit = true; 
     config.vSyncEnabled = true; 

     new LwjglApplication(new Box2DDemoMain(), config); 
    } 
} 
+0

ありがとうございました。 – Siggy1000

+0

この行の8と3の意味は何ですか? world.step(Gdx.graphics.getDeltaTime()、8、3); – Siggy1000

+0

これは、速度反復と位置反復です。これらの値は、Box2Dマニュアルで推奨されています。セクション2.4を参照してください - マニュアルはここにあります:http://www.box2d.org/manual.html –

4

これらのメソッドをどこにでも呼び出す必要はありません。クラスを作成し、そこにContactListenerを実装するだけです。今すぐあなたのコードでworld.setContactListener(ContactListener listener)を使用してください。

あなたの世界で衝突が発生するたびに、4つのメソッドすべてが呼び出されます。 2台の衝突体のフィクスチャAとフィクスチャBを取得します

+0

thx、私は血まみれの騒ぎです:D – Siggy1000

+0

は聞く方法がありません身体だけで作られた連絡先に? 'body.setContactListener(new ContactListenger {...})'のようなものです。そうすれば、*他の*衝突オブジェクトが何であるかを確認するだけで、最初のものが* body *オブジェクトであることが常に確認されます。 'world.setContactListener'では、常に両方の器具本体を最初にチェックする必要があります。 – xetra11

関連する問題