2013-01-07 4 views
1

하향식 게임에서 간단한 타일 기반 충돌 시스템을 구현했지만 모서리를 가로 질러 움직이는 데 문제가 있습니다. 현재, 내 프로그램은 플레이어의 중심점을 가져 와서 20px 정사각형 격자 (교대 회색 cbackground)의 타일로 작업합니다. 충돌을 위해 위, 아래, 왼쪽 및 오른쪽 타일을 확인하고 발견하면 다음 단계로 이동합니다.타일 기반 충돌; 코너 충돌 문제

다음 단계는 플레이어가 타일 안에 있는지 확인하는 것입니다. 이를 위해 getCenterDistanceFromCurrentTile() (광고 소재 이름, 알고 있음)이라는 기능이 있습니다. 그러면 타일의 중심점에서 플레이어의 중심점까지의 거리에 해당하는 Vector2i (x 및 y)가 반환됩니다. 나는 다음과 같은 방법으로 이것을 사용한다.

  • 가 좌측 벽 타일이고, 플레이어의 X 거리 < 0 (플레이어가 현재 타일의 중심점의 왼쪽에), 플레이어가 옆 타일 (X)으로 이동하면 벽.
  • 오른쪽 벽이 있고 플레이어의 x 거리가> 0 (현재 타일의 중심점 오른쪽) 인 경우 플레이어가 벽 옆의 타일 x로 이동합니다.
  • 동일한 방식으로 Y 축에 대해 계속됩니다.

내 문제는 대각선입니다. 나는 현재 대각선 충돌을 확인하지 않지만 내가해야 할 것처럼 보입니다. 나는 이미 그것을 구현하려는 시도를했지만 플레이어는 구석에 충돌했을 때 주위를 뛰어 넘는다. 위의 플레이어 x <과 플레이어 y < 0의 방법을 함께 사용했으나 제대로 작동하지 않았습니다. 내 문제를 더 잘 설명 할 수있는 몇 가지 이미지를 만들었습니다.

Problem image 1

이 이미지는 (파란색 타일로 표시) 왼쪽에 충돌하여, 잘 작동 내 충돌 시스템을 설명하고, 분홍색 타일이 확인되고 있지만, 충돌을 찾을 수 없습니다. 녹색 타일에는 플레이어의 현재 타일이 표시되고 빨간색 사각형에는 플레이어의 현재 위치가 표시됩니다.

Problem image 2

이 이미지는 분명히 내가 가지고있는 문제를 보여줍니다. 분홍색 타일 중 아무 것도 충돌하지 않았으므로 플레이어의 x 및 y를 확인할 필요가 없습니다.

게임에서 코너 충돌을 어떻게 체크해야합니까?

내 현재 충돌 확인 코드;

public boolean isWall(Vector2i loc) 
{ 
    return this.isWall(loc.x, loc.y); 
} 

public boolean isWall(int x, int y) 
{ 
    if (x < 0) return true; 
    if (y < 0) return true; 
    if (y > map[0].length-1) return true; 
    if (x > map.length-1) return true; 
    return map[x][y]; 
} 

public void phys(Player plr) { 
    Vector2i playerTile = plr.getTile(); 
    // Left 
    if (isWall(playerTile.x-1, playerTile.y)) 
    { 
     Vector2i distanceFromTile = plr.getCenterDistanceFromCurrentTile(true); 
     if (distanceFromTile.x < 0) 
     { 
      plr.setX(playerTile.x*BLOCK_SIZE); 
     } 
    } 
    // Right 
    if (isWall(playerTile.x+1, playerTile.y)) 
    { 
     Vector2i distanceFromTile = plr.getCenterDistanceFromCurrentTile(true); 
     if (distanceFromTile.x > 0) 
     { 
      plr.setX(playerTile.x*BLOCK_SIZE); 
     } 
    } 
    // Up 
    if (isWall(playerTile.x, playerTile.y-1)) 
    { 
     Vector2i distanceFromTile = plr.getCenterDistanceFromCurrentTile(true); 
     if (distanceFromTile.y < 0) 
     { 
      plr.setY(playerTile.y*BLOCK_SIZE); 
     } 
    } 
    // Down 
    if (isWall(playerTile.x, playerTile.y+1)) 
    { 
     Vector2i distanceFromTile = plr.getCenterDistanceFromCurrentTile(true); 
     if (distanceFromTile.y > 0) 
     { 
      plr.setY(playerTile.y*BLOCK_SIZE); 
     } 
    } 
} 

답변

1

귀하의 phys 메서드는 플레이어가 벽과 충돌하는지 여부에 따라 부울 값을 반환 할 수 있습니다. 그런 다음이 함수의 결과를 사용하여 이동하기 전의 공간에서 이전 위치로 다시 이동할지 또는 충돌하지 않은 경우 계속할지 여부를 결정할 수 있습니다.

이렇게하면 플레이어 주변의 모든 인접한 벽을 확인해야합니다. 이것은 phys 메소드의 충돌 체크를 통해 훨씬 더 깨끗한 반복 방법을 도입합니다.

public boolean phys(Player plr) 
{ 
    java.awt.Rectangle playerBounds = new java.awt.Rectangle(plr.x, plr.y, BLOCK_SIZE, BLOCK_SIZE); 

    for (int y = 0; y < 3; y++) 
    { 
     for (int x = 0; x < 3; x++) 
     { 
      // Skip the tile the player is on assuming that he is not on a wall already 
      if (x == 1 && y == 1) continue; 

      java.awt.Rectangle bounds = new java.awt.Rectangle(/*tile at (x, y) xpos*/, /*tile at (x, y) ypos*/, BLOCK_SIZE, BLOCK_SIZE); 

      if (bounds.intersects(playerBounds)) 
      { 
       return true; 
      } 
     } 
    } 

    // Did not collide 
    return false; 
} 
+1

감사합니다, 나는 포인터로 이것을 사용하고 고정 : 같은

이러한 개선이 보일 것이다. 수정 된 코드; https://gist.github.com/4485362 –