하향식 게임에서 간단한 타일 기반 충돌 시스템을 구현했지만 모서리를 가로 질러 움직이는 데 문제가 있습니다. 현재, 내 프로그램은 플레이어의 중심점을 가져 와서 20px 정사각형 격자 (교대 회색 cbackground)의 타일로 작업합니다. 충돌을 위해 위, 아래, 왼쪽 및 오른쪽 타일을 확인하고 발견하면 다음 단계로 이동합니다.타일 기반 충돌; 코너 충돌 문제
다음 단계는 플레이어가 타일 안에 있는지 확인하는 것입니다. 이를 위해 getCenterDistanceFromCurrentTile()
(광고 소재 이름, 알고 있음)이라는 기능이 있습니다. 그러면 타일의 중심점에서 플레이어의 중심점까지의 거리에 해당하는 Vector2i (x 및 y)가 반환됩니다. 나는 다음과 같은 방법으로 이것을 사용한다.
- 가 좌측 벽 타일이고, 플레이어의 X 거리 < 0 (플레이어가 현재 타일의 중심점의 왼쪽에), 플레이어가 옆 타일 (X)으로 이동하면 벽.
- 오른쪽 벽이 있고 플레이어의 x 거리가> 0 (현재 타일의 중심점 오른쪽) 인 경우 플레이어가 벽 옆의 타일 x로 이동합니다.
- 동일한 방식으로 Y 축에 대해 계속됩니다.
내 문제는 대각선입니다. 나는 현재 대각선 충돌을 확인하지 않지만 내가해야 할 것처럼 보입니다. 나는 이미 그것을 구현하려는 시도를했지만 플레이어는 구석에 충돌했을 때 주위를 뛰어 넘는다. 위의 플레이어 x <과 플레이어 y < 0의 방법을 함께 사용했으나 제대로 작동하지 않았습니다. 내 문제를 더 잘 설명 할 수있는 몇 가지 이미지를 만들었습니다.
이 이미지는 (파란색 타일로 표시) 왼쪽에 충돌하여, 잘 작동 내 충돌 시스템을 설명하고, 분홍색 타일이 확인되고 있지만, 충돌을 찾을 수 없습니다. 녹색 타일에는 플레이어의 현재 타일이 표시되고 빨간색 사각형에는 플레이어의 현재 위치가 표시됩니다.
이 이미지는 분명히 내가 가지고있는 문제를 보여줍니다. 분홍색 타일 중 아무 것도 충돌하지 않았으므로 플레이어의 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);
}
}
}
감사합니다, 나는 포인터로 이것을 사용하고 고정 : 같은
이러한 개선이 보일 것이다. 수정 된 코드; https://gist.github.com/4485362 –