2012-04-09 21 views
1

センサーボディでプレーヤーの衝突を検出しようとしています。プラットフォーマーでコレクティブルを想像してみてください...プレーヤーがコレクティブルに衝突したときにイベントを実行したいと思います。Libdgx Box2D - 衝突の検出

私のコードからわかるように、私は動的オブジェクトをコレクティブオブジェクトに加えて、プレーヤーがセンサーに衝突したときにプレイヤーの衝突のイベントを付けることを望んでいるセンサーボディを付けています。 "ContactListener"インターフェースがあるようですが、メソッドの実装は何もしないようです。これをどうやってやりますか?以下のいずれかを行うためのより良い方法がある場合は

、何かアドバイスをいただければ幸いです:)

import com.badlogic.gdx.math.Vector2; 
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.FixtureDef; 
import com.badlogic.gdx.physics.box2d.Manifold; 
import com.badlogic.gdx.physics.box2d.PolygonShape; 
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; 

public class CoinCollectible extends GameObject{ 

    public CoinCollectible(Vector2 position, float angle){ 
     bodyDef.type = BodyType.DynamicBody; 
     bodyDef.position.x = position.x; 
     bodyDef.position.y = position.y; 
     bodyDef.angle = angle; 

     PolygonShape poly = new PolygonShape(); 
     poly.setAsBox(1, 1); 
     FixtureDef itemFixture = new FixtureDef(); 
     itemFixture.shape = poly; 
     itemFixture.density = 1; 
     itemFixture.filter.categoryBits = PhysicsLayers.LAYER_ITEM; 
     itemFixture.filter.maskBits = PhysicsLayers.MASK_PLAYER; 
     fixtureArray.add(itemFixture); 

     massData.mass = 1f; 

     // Attach a collision sensor 
     FixtureDef sensorFixture = new FixtureDef(); 
     sensorFixture.shape = poly; 
     sensorFixture.isSensor = true; 
     sensorFixture.filter.maskBits = PhysicsLayers.LAYER_PLAYER; 

     fixtureArray.add(sensorFixture); 

     // Clean up 
     poly.dispose(); 

    } 
} 

import java.util.ArrayList; 
import java.util.List; 

import com.badlogic.gdx.physics.box2d.Body; 
import com.badlogic.gdx.physics.box2d.BodyDef; 
import com.badlogic.gdx.physics.box2d.FixtureDef; 
import com.badlogic.gdx.physics.box2d.MassData; 
import com.badlogic.gdx.physics.box2d.World; 

public class GameObject{ 

    public Body body = null; 
    public BodyDef bodyDef = new BodyDef(); 
    public MassData massData = new MassData(); 

    protected List<FixtureDef> fixtureArray = new ArrayList<FixtureDef>(); 

    public GameObject(){} 

    public Body addToWorld(World world){ 
     if(bodyDef == null) 
      return null; 

     body = world.createBody(bodyDef); 

     while(fixtureArray.size() > 0){ 
      body.createFixture(fixtureArray.remove(0)); 
     } 

     body.setMassData(massData); 

     return body; 
    } 

} 

答えて

0

を(コインコンストラクタで)あなたのコードでは、この行を追加してみてください。

bodyDef.userData = this;

連絡先リスナーget userdataをキャストしてGameObjectにキャストし、たとえばイベント衝突を呼び出します。あなたはBOX2D collisionlisiter方法のビーイング接触またはEnd連絡先にSensor体の衝突をチェックする必要が

挨拶

0

間違っている可能性が

0

2つのこと:
1)OPが正しくContactListenerを設定しませんでした:それはContactListener

ソリューションをトリガしないようにbox2d.World
2)をインスタンス化した後、カテゴリとマスクビットが正しく設定されていません10 1)フィジックスワールドをインスタンス化した直後に、 がありません。これにより、box2d.WorldのContactListenerがトリガーするように設定されます。作品ならば、あなたはそれをテストできるように

physicsWorld = new World(new Vector2(0,-9),true); 
physicsWorld.setContactListener(
    new ContactListener() { 
     @Override 
     public void beginContact(Contact contact) { 
      Fixture fA = contact.getFixtureA(); 
      Fixture fB = contact.getFixtureB(); 
      Gdx.app.log("beginContact", "between " + fA.toString() + " and " + fB.toString()); 
     } 

     @Override 
     public void endContact(Contact contact) { 
      Gdx.app.log("endContact", "between "); 
     } 

     @Override 
     public void preSolve(Contact contact, Manifold oldManifold) { 
      //you can leave this empty 
     } 

     @Override 
     public void postSolve(Contact contact, ContactImpulse impulse) { 
      //you can leave this empty 
     } 
    }); 

2)は、この方法でカテゴリとマスクビットを設定(OPは彼PhysicsLayersで使用される特定の値を示さなかった)

public CoinCollectible(Vector2 position, float angle){ 
    // ... 
    itemFixture.filter.categoryBits = 1; 
    itemFixture.filter.maskBits = 2; 
    sensorFixture.filter.categoryBits = 2; 
    sensorFixture.filter.maskBits = 1; 
} 
+0

間違っているかを説明してくださいOPのコードで、なぜあなたの答えを編集して問題を解決するのか* –