2013-05-25 3 views
0

내 게임의 충돌에 문제가 있습니다. 게임은 "타일 기반"입니다. 문제는 플레이어가 그 안에 들어가는 것을 막는 타일을 배치 할 때 타일에 인접한 무한한 수직 및 수평 장벽을 생성합니다. 그것은이 작업을 수행하는 이유 나도 몰라충돌이 작동하지 않습니다.

double d = delta; 
Point oldVerticalPoint = new Point(point.getX(), point.getY()); 
if (Keyboard.isKeyDown(Keyboard.KEY_UP)) 
    point.setY((float) (point.getY() - (speed * d))); 
if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) 
    point.setY((float) (point.getY() + (speed * d))); 
for (int x = 1; x <= game.map.width; x++) { 
    for (int y = 1; y <= game.map.height; y++) { 
     Block block = game.map.getBlock(x, y); 
     if (block instanceof BlockWall) { 
      BlockWall b = (BlockWall) block; 
      Point blockPoint = Block.getStandardBlockCoords(x, y); 
      Point playerPoint = game.thePlayer.point; 
      if (playerPoint.getY() > blockPoint.getY() && playerPoint.getY() < <blockPoint.getY() + Block.LENGTH) 
       game.thePlayer.point = oldVerticalPoint; 
     } 
    } 
} 

Point oldHorizontalPoint = new Point(point.getX(), point.getY());; 
if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) 
    point.setX((float) (point.getX() - (speed * d))); 
if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) 
    point.setX((float) (point.getX() + (speed * d))); 
for (int x = 1; x <= game.map.width; x++) { 
    for (int y = 1; y <= game.map.height; y++) { 
     Block block = game.map.getBlock(x, y); 
     if (block instanceof BlockWall) { 
      BlockWall b = (BlockWall) block; 
      Point blockPoint = Block.getStandardBlockCoords(x, y); 
      Point playerPoint = game.thePlayer.point; 
      if (playerPoint.getX() > blockPoint.getX() && playerPoint.getX() < blockPoint.getX() + Block.LENGTH) 
       game.thePlayer.point = oldHorizontalPoint; 
     } 
    } 
} 

:

여기 내 코드입니다. 한 가지 분명한 것은 두 가지 충돌 감지가있는 이유입니다. 플레이어가 벽에 수평으로 이동하고 간단한 타일과 같은 무언가에 수직으로 움직이는 경우 플레이어는 완전히 움직이지 않을 것입니다. 또한 getStandardBlockCoords는 블록 X 및 Y가 경우 때문에, 예를 들어 사용되는 X = 1 및Y = 2 블록이 두 번째 열의 첫 번째 행을 의미.되고 이 메서드는 이것을 단순히 픽셀 좌표로 변환합니다.

저는 LWJGL과 Slick2D를 사용하고 있습니다. 도움?

답변

1

충돌을 감지하려면 Slick has 메소드를 사용해야합니다. 그것은 아주 좋은 생각입니다.

if (block instanceof BlockWall) 
    { 
     BlockWall b = (BlockWall)block; 
     Point blockPoint= Block.getStandardBlockCoords(x, y); 
     Point playerPoint = game.thePlayer.point; 
      //You should use playerPoint.contains(blockPoint){ }; 
     if (playerPoint.getY() > blockPoint.getY() && playerPoint.getY() < 
      blockPoint.getY() + Block.LENGTH) 
      game.thePlayer.point = oldVerticalPoint; 
     } 
    } 
} 

이제 코드와 내 코드에 문제가.

코드 : 코드는 X 및 Y 위치 인 2 포인트를 가져옵니다. 이 포인트 만 유효성을 검사합니다. 그래서 블록이 x = 250, y = 300에서 30 x 50이라면 말하십시오. 이제 전체 블록을 검사 할 수 있기를 원합니다. 그러나 X 및 Y 위치 만 검사합니다.

if(playerPoint.contains(blockPoint)){ 
    //if only playerPoint x = 250 and y = 300 will this ever be true 
} 

그래서 당신은, X = 260 Y = (330)를 확인하려는 경우 포인트가 서로를 포함하지 않기 때문에 문이 false를 반환합니다. 이제 직사각형, 다각형 등의 모양을 사용했다면 객체가 생성 될 때 생성되는 크기 매개 변수를 갖게됩니다. 즉, contains은 전체 모양을 검사합니다. 점이 260과 330이라면 플레이어가 blockPoint를 포함하고 있기 때문에 if 문이 true가됩니다.

나를 알면 이해가되지 않으면 필요한 경우 추가 설명을하겠습니다.

또한 코드가 매우 혼란 스럽습니다. 들여 쓰기하십시오! 그것은 차이의 세계를 만듭니다.

관련 문제