2017-11-05 6 views
0

私はLibgdxを使用してAndroidスタジオでスーパーマリオブラザーズのゲームを開発していますが、今まで私はエラーが発生しておらず、プロジェクトは正常に動作しています。しかし、Box2Dのカテゴリフィルタとマスクフィルタを使用して、スプライトと衝突したときにオブジェクトを「破棄する」と(Marioがジャンプし、レンダリングがブリックになるレンガにヒットすると)、レンガは「破壊」されますが、Marioは彼の頭がレンガの上層(オブジェクトの四角形の輪郭の上辺)に達するまで、レンガであったものをジャンプするだけです。ここではいくつかのスクリーンショットがあります:あなたが見ることができるようにScreenshot before collision with brickAndroidスタジオでLibgdxを使用してBox2Dを使用して、衝突時にオブジェクトが完全に破壊されることはありません。スプライトは完全に破壊されたオブジェクトを通過することはできません

Screenshot after collision with brick は、マリオは、私はいくつかのコードを書いたので、正常に動作している破壊されたbrick.The衝突検出の上部を示し、上側のかすかな緑の線より高くジャンプすることはできませんレンガと衝突が検出された場合はログに「レンガ:衝突」と表示され、最初にレンガと衝突するときには正になります。私の疑問が浮かび上がって、どうしてオブジェクトがまったくないかのように自由に飛び越えることができるはずの破壊されたレンガの上部よりも高く飛び出さないのです。現在、彼は正方形の上部から跳ね返って、彼は上に行くことができません。

メインクラス:

public static final short DEFAULT_BIT = 1; 
public static final short MARIO_BIT = 2; 
public static final short BRICK_BIT = 4; 
public static final short COIN_BIT = 8; 
public static final short DESTROYED_BIT = 16; 

InteractiveTileObjectクラス:

public abstract void onHeadHit(); 
public void setCategoryFilter(short filterBit){ 
    Filter filter = new Filter(); 
    filter.categoryBits = filterBit; 
    fixture.setFilterData(filter); 
} 
public TiledMapTileLayer.Cell getCell(){ 
    TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(1); 
    return layer.getCell((int)(body.getPosition().x * SuperMarioBros.PPM/16), 
      (int)(body.getPosition().y * SuperMarioBros.PPM/16)); 

マリオスプライトクラス:

FixtureDef fdef = new FixtureDef(); 
    CircleShape shape = new CircleShape(); 
    shape.setRadius(6/SuperMarioBros.PPM); 
    fdef.filter.categoryBits = SuperMarioBros.MARIO_BIT; 
    fdef.filter.maskBits = SuperMarioBros.DEFAULT_BIT | SuperMarioBros.COIN_BIT | SuperMarioBros.BRICK_BIT ; 

    fdef.shape = shape; 
    b2body.createFixture(fdef); 

    FixtureDef fdef2 = new FixtureDef(); 
    EdgeShape feet = new EdgeShape(); 
    feet.set(new Vector2(-2/SuperMarioBros.PPM, -6/SuperMarioBros.PPM), new Vector2(2/SuperMarioBros.PPM, -6/SuperMarioBros.PPM)); 
    fdef2.shape = feet; 
    b2body.createFixture(fdef2); 

    EdgeShape head = new EdgeShape(); 
    head.set(new Vector2(-2/SuperMarioBros.PPM, 6/SuperMarioBros.PPM), new Vector2(2/SuperMarioBros.PPM, 6/SuperMarioBros.PPM)); 
    fdef.shape = head; 
    fdef.isSensor = true; 

    b2body.createFixture(fdef).setUserData("head"); 

レンガスプライトクラス:

public class Brick extends InteractiveTileObject { 
public Brick(World world, TiledMap map, Rectangle bounds) { 
    super(world, map, bounds); 
    fixture.setUserData(this); 
    setCategoryFilter(SuperMarioBros.BRICK_BIT); 
} 

@Override 
public void onHeadHit() { 
    Gdx.app.log("Brick", "Collision"); 
    setCategoryFilter(SuperMarioBros.DESTROYED_BIT); 
    getCell().setTile(null); 
    } 
} 
012ここに関連するコードです

私は

+0

あなたの問題を正しく理解すれば、あなたのプレーヤーはブロックを飛び越えることはできませんが、彼がそれを衝突させなければ、彼はより高いジャンプをしますか? – icarumbas

+0

@icarumbasはい、それは正しいです。しかし、私は問題を修正したと思うが、なぜそれが修正されるのか分からない。私は "fdef.filter.categoryBits = SuperMarioBros.MARIO_BIT; fdef.filter.maskBits = SuperMarioBros.DEFAULT_BIT | SuperMarioBros.COIN_BIT | SuperMarioBrosをコピーしました。BRICK_BIT; "と貼り付けて、足のフィクスチャの定義であるfdef2セクションに貼り付け、fdef2.filterなどに名前を変更してください) –

+0

あなたの体は2つのフィクスチャを持ち、両方にフィルタを設定する必要があります。 – icarumbas

答えて

0

どこでもオンラインソリューションを今かなり長い間、この問題で苦労されていると発見していない助けてください、私はあるfdef2するfilter.maskBitsとfilter.categoryBitsフィルタを適用することによって、この問題を解決しましたマリオの足。私は、文字通り貼り付けコピー:

fdef.filter.categoryBits = SuperMarioBros.MARIO_BIT; fdef.filter.maskBits = SuperMarioBros.DEFAULT_BIT | SuperMarioBros.COIN_BIT | SuperMarioBros.BRICK_BIT ;

とfdef2するFDEF改名さはので、私のコードは次のようになります。

FixtureDef fdef = new FixtureDef(); 
    CircleShape shape = new CircleShape(); 
    shape.setRadius(6/SuperMarioBros.PPM); 
    fdef.filter.categoryBits = SuperMarioBros.MARIO_BIT; 
    fdef.filter.maskBits = SuperMarioBros.DEFAULT_BIT | SuperMarioBros.COIN_BIT | SuperMarioBros.BRICK_BIT ; 

    fdef.shape = shape; 
    b2body.createFixture(fdef); 

    FixtureDef fdef2 = new FixtureDef(); 
    EdgeShape feet = new EdgeShape(); 
    feet.set(new Vector2(-2/SuperMarioBros.PPM, -6/SuperMarioBros.PPM), new Vector2(2/SuperMarioBros.PPM, -6/SuperMarioBros.PPM)); 
    fdef2.filter.categoryBits = SuperMarioBros.MARIO_BIT; 
    fdef2.filter.maskBits = SuperMarioBros.DEFAULT_BIT | SuperMarioBros.COIN_BIT | SuperMarioBros.BRICK_BIT ; 
    fdef2.shape = feet; 
    b2body.createFixture(fdef2); 

    EdgeShape head = new EdgeShape(); 
    head.set(new Vector2(-2/SuperMarioBros.PPM, 6/SuperMarioBros.PPM), new Vector2(2/SuperMarioBros.PPM, 6/SuperMarioBros.PPM)); 
    fdef.shape = head; 
    fdef.isSensor = true; 

    b2body.createFixture(fdef).setUserData("head"); 

、これは私がなぜあまりわからないが、動作しているようですか?彼の足は頭が上を通らないのに対して、足は四角の底を通り抜けることができるからだと思う。私は問題の根本的な原因は、彼の足が物体を検出したときで、頭がそうでないときマリオが足を乗せて正方形を通過できなかったことだと思う。私はそうであってもそれに応じて動作し、それが必要結果を生成fdef2に関連するすべてのコードを削除する彼の足のための治具を必要としません実現

--- EDIT ---。

+0

あなた自身の答えを受け入れることができます。 – icarumbas

+0

@icarumbas私はstackoverflowに新しいので、私に知らせてくれてありがとう、しかし、私は2日待たなければならないと言います。 –

関連する問題