2017-11-05 23 views
0

Libgdx를 사용하는 Android Studio에서 Super Mario Bros 게임을 개발 중이며, 지금까지 오류가 발생하지 않았으며 프로젝트가 정상적으로 실행됩니다. 그러나 Box2D의 카테고리 및 마스크 필터를 사용하여 스프라이트와 충돌 할 때 객체를 "파괴"할 때 (마리오가 점프하고 그의 머리가 벽돌을 부수는 벽돌을 치는 경우) 벽돌이 "파괴"되지만 마리오는 그의 머리가 벽돌의 위층 (물건의 정사각형 윤곽선의 윗면)에 도달 할 때까지는 벽돌이었던 것을 뛰어 넘기 만했다. 여기에 몇 가지 스크린 샷은 다음과 같습니다 당신이 볼 수 있듯이 Screenshot before collision with brickAndroid Studio의 Libgdx에서 Box2D를 사용하여 충돌시 오브젝트가 완전히 파괴되지 않습니다. Sprite가 완전히 파괴 된 객체를 통과 할 수 없습니다.

Screenshot after collision with brick 가, 마리오는 내가 몇 가지 코드를 작성하기 때문에 잘 작동 파괴 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,

내가

+0

그래서 문제를 정확하게 이해하면 플레이어가 블록을 뛰어 넘을 수는 없지만 충돌하지 않으면 더 높은 점프를 할 수 있습니까? – icarumbas

+0

@icarumbas 예, 맞습니다. 그러나 문제는 해결 된 것으로 생각되지만 해결 이유는 확실하지 않습니다. "fdef.filter.categoryBits = SuperMarioBros.MARIO_BIT; fdef.filter.maskBits = SuperMarioBros.DEFAULT_BIT | SuperMarioBros.COIN_BIT | SuperMarioBros를 복사했습니다.BRICK_BIT; "라고 표시하고 fdef2.filter로 이름을 바꾼 fdef2 섹션에 붙여 넣었습니다. 그리고 작동합니다! –

+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 ;

및 FDEF 그래서 내 코드는 지금과 같은 fdef2로 변경 : 말 그대로 붙여 복사

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 관련된 모든 코드를 삭제 그의 발에 대한 고정이 필요하지 않습니다 실현

--- 수정 ---.

+0

고객님의 답변을 수락하실 수 있습니다. – icarumbas

+0

@icarumbas 저는 stackoverflow를 처음 접했을 때 감사 드리며, 2 일을 기다려야한다고 말합니다. –