Libgdx를 사용하는 Android Studio에서 Super Mario Bros 게임을 개발 중이며, 지금까지 오류가 발생하지 않았으며 프로젝트가 정상적으로 실행됩니다. 그러나 Box2D의 카테고리 및 마스크 필터를 사용하여 스프라이트와 충돌 할 때 객체를 "파괴"할 때 (마리오가 점프하고 그의 머리가 벽돌을 부수는 벽돌을 치는 경우) 벽돌이 "파괴"되지만 마리오는 그의 머리가 벽돌의 위층 (물건의 정사각형 윤곽선의 윗면)에 도달 할 때까지는 벽돌이었던 것을 뛰어 넘기 만했다. 여기에 몇 가지 스크린 샷은 다음과 같습니다 당신이 볼 수 있듯이 Android Studio의 Libgdx에서 Box2D를 사용하여 충돌시 오브젝트가 완전히 파괴되지 않습니다. Sprite가 완전히 파괴 된 객체를 통과 할 수 없습니다.
가, 마리오는 내가 몇 가지 코드를 작성하기 때문에 잘 작동 파괴 brick.The 충돌 감지의 상단 부분을 의미 상단 희미한 녹색 선보다 높은 점프 수 없습니다 브릭과 충돌이 감지되면 "Brick : Collision"을 표시하는 로그가 표시되며, 브릭이 처음으로 브릭과 충돌 할 때 긍정적 인 결과가 나타납니다. 따라서 나의 질문이 제기된다. 왜 그가 물체가 전혀없는 것처럼 자유롭게 뛰어 넘을 수있을 때 파괴 된 벽돌의 윗부분보다 더 높이 올라가지 않는다. 현재 그는 광장의 꼭대기에서 튀어 나와 더 높이 올라갈 수 없습니다.
Main 클래스 :
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 여기에 관련 코드 3,516,
내가
그래서 문제를 정확하게 이해하면 플레이어가 블록을 뛰어 넘을 수는 없지만 충돌하지 않으면 더 높은 점프를 할 수 있습니까? – icarumbas
@icarumbas 예, 맞습니다. 그러나 문제는 해결 된 것으로 생각되지만 해결 이유는 확실하지 않습니다. "fdef.filter.categoryBits = SuperMarioBros.MARIO_BIT; fdef.filter.maskBits = SuperMarioBros.DEFAULT_BIT | SuperMarioBros.COIN_BIT | SuperMarioBros를 복사했습니다.BRICK_BIT; "라고 표시하고 fdef2.filter로 이름을 바꾼 fdef2 섹션에 붙여 넣었습니다. 그리고 작동합니다! –
신체에 2 개의 조명기가 있고 두 필터를 모두 설정해야합니다 – icarumbas