2011-10-22 2 views
-2

У меня есть что-то вроде этого:2D игры плиточного обнаружение столкновения

 // checking on which tile are players corners 
     // ignore this big mess below, please. It can be put in smaller 
     // equations, but for now it does its job 
     left_downX = ((int)Position.X)/32 * 32/32 - map.mapOffsetX/32 * 32/32; 
     left_downY = ((int)Position.Y + height)/32 * 32/32 - map.mapOffsetY/32 * 32/32; 

     right_downX = ((int)Position.X + width)/32 * 32/32 - map.mapOffsetX/32 * 32/32; 
     right_downY = ((int)Position.Y + height)/32 * 32/32 - map.mapOffsetY/32 * 32/32; 

     left_upX = ((int)Position.X)/32 * 32/32 - map.mapOffsetX/32 * 32/32; 
     left_upY = ((int)Position.Y)/32 * 32/32 - map.mapOffsetY/32 * 32/32; 

     right_upX = ((int)Position.X + width)/32 * 32/32 - map.mapOffsetX/32 * 32/32; 
     right_upY = ((int)Position.Y)/32 * 32/32 - map.mapOffsetY/32 * 32/32; 

     // checking if there is collision and responding to it 
     if (map.mapData[left_downX, left_downY] == (int)Map.Tiles.air && 
      map.mapData[left_upX, left_upY] == (int)Map.Tiles.air) 
     { 
      if (keyboardState.IsKeyDown(Keys.A)) 
      { 
       Speed.X = playerSpeed; 
       Direction.X = MOVE_LEFT; 
      } 
     } 
     if (map.mapData[right_downX, right_downY] == (int)Map.Tiles.air && 
      map.mapData[right_upX, right_upY] == (int)Map.Tiles.air) 
     { 
      if (keyboardState.IsKeyDown(Keys.D)) 
      { 
       Speed.X = playerSpeed; 
       Direction.X = MOVE_RIGHT; 
      } 
     } 
     if (map.mapData[left_downX, left_downY] == (int)Map.Tiles.air && 
      map.mapData[right_downX, right_downY] == (int)Map.Tiles.air) 
     { 
      if (keyboardState.IsKeyDown(Keys.S)) 
      { 
       Speed.Y = playerSpeed; 
       Direction.Y = MOVE_DOWN; 
      } 
     } 
     if (map.mapData[left_downX, left_downY] == (int)Map.Tiles.air && 
      map.mapData[right_downX, right_downY] == (int)Map.Tiles.air) 
     { 
      if (keyboardState.IsKeyDown(Keys.W)) 
      { 
       Speed.Y = playerSpeed; 
       Direction.Y = MOVE_UP; 
      } 
     } 

И, как кажется, правильно работать, это не так. Например, когда игрок сталкивается с землей, он остается в нем и не может двигаться в любом направлении.
Это похоже при столкновении только с плитками по бокам, но там вы можете перейти на другую сторону.

Что я не так понял? Может быть, есть ли лучшие способы проверки столкновений, не зацикливая все плитки?

ответ

1

Первые 8 строк вашего кода должны быть заменены на объект Rectangle, который должен быть того же размера/местоположения, что и ваш Sprite.

Тогда вы можете просто позвонить по методу Rectangle.Intersects против плиток, которые вы проверяете против столкновения.

+0

, но он хорошо проверяет столкновений, и я также не хочу, чтобы все циклы выполнялись. У меня проблемы с ответами, так как игрок застревает только стоячая палочка или в некоторых случаях плавает сквозь стены, иногда просто скользит. – Neomex

+0

Самое лучшее, что нужно сделать с картой на основе плитки, - это проверить только те плитки, которые находятся рядом с объектом, который проверяется на наличие столкновений. Это должно быть достаточно легко сделать с координатами рассматриваемого объекта. Для меня ваш игрок застревает, потому что ваше столкновение работает неправильно. – jgallant