2013-07-26 2 views
3

좋은 하루 이여위한 계층 개체Libgdx : 타일은 충돌

지금 알아낼 내가 원하는 더 구체적으로, 타일 개체 레이어를 사용하여 내 플레이어의 충돌 감지를 수행하는 방법이다려고 내가 바둑판 식으로 그려 놓은지도에서 폴리 라인을 찾아 냈습니다. Tiled의 충돌 감지에 대해 Google에서 연구하면서이 간단한 예제는 superkoala sample for TiledmapLayer입니다. 코드를 이해하고 (내가 틀렸다면 수정하십시오), 플레이어가 충돌을 감지하기 위해 플레이어는 특정 레이어의 각 타일을 읽을 것입니다. 예를 들어 땅과 다른 객체가 포함 된 전경 레이어를 읽습니다.

기본적으로 객체 레이어에서 수행 한 작업은 Wall에 폴리 라인을 지정하고 사용했던 폴리 라인 수에 따라 숫자로 입력하는 유형에 대한 것입니다. 그래서 미래의 사용을 위해이 충돌 벽 번호를 호출 할 수 있습니다.

누구든지 개체를 읽고 충돌 감지에 사용하는 샘플 코드를 제공 할 수 있습니까? 아니면 간단한 팁이나 아이디어를 어떻게 해결할 수 있습니까? 어떤 도움을 주시면 감사하겠습니다.

답변

1

귀하의 경우에 권장하는 것은 개체 레이어를 사용하지 않고 특정 타일의 속성을 사용하는 것입니다. '타일'에 하나의 타일이 있고 벽으로 만 사용해야한다고 가정 해 보겠습니다. 해당 타일을 클릭하고 "차단됨"속성을 추가하십시오. 그런 다음 코드에서 플레이어 옆에있는 모든 셀을 검사 할 수 있으며 "차단됨"속성이있는 경우 플레이어가 그 방향으로 이동하지 못하도록합니다. 여기에 내가 해냈어 방법에 대한 의사 코드입니다 :

private boolean isCellBlocked(float x, float y) { 
    Cell cell = null; 
    boolean blocked = false; 

    try { 
     cell = collisionLayer.getCell((int) (x/collisionLayer.getTileWidth()), (int) (y/collisionLayer.getTileHeight())); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    if (cell != null && cell.getTile() != null) { 
     if (cell.getTile().getProperties().containsKey("blocked")) { 
      blocked = true; 
     } 
    } 
    return blocked; 
} 

는 당신은 플레이어 전화 isCellBlocked(x, y) 그는이 갱신 될 때마다 만들 수 있습니다.

나는 또한 모든면 (collidesTop(float x, float y) 등)에 대해 collidesSide(float x, float y)을 수행했습니다.

원하는 시스템을 사용하지 않더라도 도움이되기를 바랍니다. 더 많은 도움이 필요하면 큰 프로젝트에서 충돌 감지에 libGDX를 많이 사용하고 있으므로 저에게 연락하는 것을 주저하지 마십시오!

+0

임 오브젝트 레이어에 대해 조언 한 이유가 궁금합니다. 교차하는 직사각형의 수가 훨씬 적습니다. 귀하의 솔루션은 의심의 여지없이 작동하지만, 속성 편집을 크게 단순화하는 객체 레이어의 사용법을 탐색하는 대신 사용자가 해낸 방법에 대한 예입니다. – RichieHH

+0

@RichieHH TileD에서 객체 레이어를 처리하는 대신 속성을 사용하는 것이 더 쉬웠습니다. – Ferdz

+0

왜? 타일을 사용하는 경우 각 타일마다 속성을 추가하고 구문 분석해야합니다. 왜 똑같은 속성을 가진 하나의 객체를 하나의 객체 레이어에 가질 수 있고 많은 경우에 하나의 B2D 몸체를 만들 수있을 때 왜 이렇게합니까? https://gist.github.com/anonymous/a2c61d04572455c75fcd – RichieHH