2017-02-03 19 views
2

У меня проблемы с обнаружением двумерных столкновений в моей игре.
Проблема в том, что прямоугольник моего плеера неправильно регистрирует пересечение с прямоугольниками других объектов.Происхождение прямоугольника для обнаружения столкновений в MonoGame

Мне интересно, имеет ли переменная происхождения, которую я использовал для вращения моего игрока, имеет какое-либо отношение к моей проблеме и как я могу ее исправить.

Я объясню проблему более подробно, но вот мой код: ПРИМЕЧАНИЕ: Происхождение имеет тип Vector2, угол имеет тип float, все прямоугольники столкновений имеют тип Rectangle.

//Player.Update method 

     //origin needs to be in update, because position of source changes for every frame of animation 
     origin = new Vector2(Width/2, Height/2); 
     playerDirection = new Vector2((float)Math.Sin(angle), (float)Math.Cos(angle)); 

     //Updating the position of my collision rectangle 
     collisionRect.X = (int)position.X; 
     collisionRect.Y = (int)position.Y; 

     //Changing the values of angle while key is pressed 
     if (Keyboard.GetState().IsKeyDown(Keys.A)) 
     { 
      angle -= 0.05f; 
     } 

     if (Keyboard.GetState().IsKeyDown(Keys.D)) 
     { 
      angle += 0.05f; 
     } 
     //Updating player's position 
     if (Keyboard.GetState().IsKeyUp(Keys.X)) 
     { 
      keyPress = false; 
     } 

     if (Keyboard.GetState().IsKeyDown(Keys.W)) 
     { 
      position -= playerDirection * Speed; 
     } 

     if (Keyboard.GetState().IsKeyDown(Keys.S)) 
      position += playerDirection * Speed; 
     //Checking for collision detection with background objects 
     if(BackgroundMaker.collisionPositions.Count >= 1) 
     { 
      foreach(Rectangle colPos in BackgroundMaker.collisionPositions) 
      { 
       if(collisionRect.Intersects(colPos)) 
       { 
        if (collisionRect.X < colPos.Right) 
         position.X = colPos.Right; 
       } 
      } 
     } 
    } 
} 

Проблема с этим кодом заключается в том, что мой игрок только сталкивается со стеной, когда он находится на полпути. Я еще не реализовал столкновение вправо, вверх и вниз, только для левой стороны.

Вот как это выглядит: enter image description here

Спасибо заранее для тех, кто может помочь мне ответить на этот вопрос. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

+0

Я бы рекомендовал, имеющий режим отладки, где вы рисуете окно коллизий для игрока , то станет более очевидным, что происходит – Ben

+0

Каков размер прямоугольника столкновения? – Ben

+1

@Ben Размер прямоугольника 32x32, который является размером и высотой символа спрайта. –

ответ

2

Ваш код работает, как вы поручили

if (collisionRect.X < colPos.Right) 
    position.X = colPos.Right; 

Здесь вы проверяете, если середина коробки столкновения меньше, чем правая сторона объекта, затем установите игроков середины позицию справа от объекта, поэтому середина игрока не может идти дальше объекта, который он пересекает.

Однако это не считая игроков ширина

Вам необходимо адаптировать свой код, чтобы работать больше, как это:

float halfWidth = 16.0f; // ideally add a width to the player class and divide by 2 
if (collisionRect.X - halfWidth < colPos.Right) 
    position.X = colPos.Right + halfWidth; 
+1

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

 Смежные вопросы

  • Нет связанных вопросов^_^