私はLibgdxを使用してAndroidスタジオでスーパーマリオブラザーズのゲームを開発していますが、今まで私はエラーが発生しておらず、プロジェクトは正常に動作しています。しかし、Box2Dのカテゴリフィルタとマスクフィルタを使用して、スプライトと衝突したときにオブジェクトを「破棄する」と(Marioがジャンプし、レンダリングがブリックになるレンガにヒットすると)、レンガは「破壊」されますが、Marioは彼の頭がレンガの上層(オブジェクトの四角形の輪郭の上辺)に達するまで、レンガであったものをジャンプするだけです。ここではいくつかのスクリーンショットがあります:あなたが見ることができるようにAndroidスタジオでLibgdxを使用してBox2Dを使用して、衝突時にオブジェクトが完全に破壊されることはありません。スプライトは完全に破壊されたオブジェクトを通過することはできません
は、マリオは、私はいくつかのコードを書いたので、正常に動作している破壊された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ここに関連するコードです
私は
あなたの問題を正しく理解すれば、あなたのプレーヤーはブロックを飛び越えることはできませんが、彼がそれを衝突させなければ、彼はより高いジャンプをしますか? – icarumbas
@icarumbasはい、それは正しいです。しかし、私は問題を修正したと思うが、なぜそれが修正されるのか分からない。私は "fdef.filter.categoryBits = SuperMarioBros.MARIO_BIT; fdef.filter.maskBits = SuperMarioBros.DEFAULT_BIT | SuperMarioBros.COIN_BIT | SuperMarioBrosをコピーしました。BRICK_BIT; "と貼り付けて、足のフィクスチャの定義であるfdef2セクションに貼り付け、fdef2.filterなどに名前を変更してください) –
あなたの体は2つのフィクスチャを持ち、両方にフィルタを設定する必要があります。 – icarumbas