2012-03-25 2 views
2

Итак, я делаю небольшую игру на копании на основе плитки, теперь я хочу совершить столкновение. Как я буду делать это правильно? Я знаю, как проверить, сталкивается ли игрок с плиткой, но я не знаю, как на самом деле заставить игрока остановиться, когда он ударит по стене.Tile Engine Collision

enter image description here

Это игра, я 20x20 плитки здесь.

Это код, я использую атм:

  foreach (Tile tiles in allTiles) 
     { 
      if (ply.rect.Intersects(tiles.rect)) 
      { 
       if (tiles.ID != -1 && tiles.ID != 1) 
       { 
        if (ply.X > tiles.X) 
        { 
         Console.WriteLine("Right part."); 
         ply.X = tiles.pos.X + 30; 
        } 

        if (ply.X <= tiles.X) 
        { 
         Console.WriteLine("Left part."); 
         ply.X = tiles.pos.X - 30; 
        } 

        if (ply.Y > tiles.Y) 
        { 
         Console.WriteLine("Bottom part."); 
         ply.Y = tiles.pos.Y + 30; 
        } 

        if (ply.Y <= tiles.Y) 
        { 
         Console.WriteLine("Upper part."); 
         ply.Y = tiles.pos.Y - 30; 
        } 
       } 
      } 
     } 
+0

Вы делаете ['Terraria'] (http://terraria.org/)? – Marty

+0

@ Марти Уоллес: Ну, я делаю кое-что из клона, да. – Stan

+0

Ah, Awesome^_^ – Marty

ответ

1

Какой тип обнаружения столкновений вы используете?

Если вы используете Rectangles и метод «.intersects», вы всегда можете объявить bool, чтобы убедиться, что ваш персонаж касается пола. Если он не вы примените вектор гравитации, чтобы он упал на следующую плиту с другим прямоугольником, поэтому, когда он ударит его, он перестанет падать.

Если вы хотите заблокировать его из стороны в сторону, просто проверьте, какая сторона прямоугольника он касается, и заблокировать его от перемещения по оси «X». Например, если он идет вправо и пересекает левую часть прямоугольника, блок является движением «GoingRight».

if(myCharacterRectangle.Intersects(tileRectangle) 
    { 

     if(myCharacterPosition.X > (tilePosition.X) 
     { 
     //You know the character hits the Right part of the tile. 
     } 

     if(mycharacterPosition.X <= tilePosition.X) 
     { 
     //You know the character hits the Left Part of the tile. 
     } 

    } 

То же самое касается положения.Y, если вы хотите проверить верх или низ.

Если вы хотите использовать обнаружение столкновения Pixel by Pixel с использованием Matrices, я знаю хороший учебник here. Обнаружение вернет 'Vector2 (-1, -1)', если нет столкновения. Если есть метод, метод вернет координаты коллизий, что еще более упростит определение того, какая часть плитки затрагивает ваш персонаж.

Надеюсь, это поможет. Удачи с вашей игрой.

+0

Я видел вопрос, похожий на ваш. Возможно, это то, что вам нужно http://www.dreamincode.net/forums/topic/167529-xna-tile-collision-detection/ – phadaphunk

+0

Спасибо за помощь, я собираюсь попробовать эту работу в ближайшее время. – Stan

+0

Я пробовал это левое и правое попадание плитки, но он не работает, он продолжал говорить, что он бьет левой стороной, независимо от того, где я был. Столкновение раздражает, потому что оно поражает так много блоков за один раз. – Stan