2015-07-05 2 views
0

CollisonПрямоугольники не перекрывались правильно

Как вы можете видеть на верхнем углу написано COL: Ложь/True. Это если игрок ограничивается и плитки, которые являются твердыми. Прямоугольники для плит и игроков проверяются, если они перехватывают друг друга. Похоже, что он работает правильно? Ну нет. Посмотрите внимательнее.

NotWorkingNotWorking

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

Теперь давайте перейдем к коду, который я использовал сейчас, надеюсь, вы понимаете проблему.

игрока Bounds (Прямоугольник)

playerBounds.Width = 32; 
playerBounds.Height = 64; 
playerBounds.X = (int)this.position.X; 
playerBounds.Y = (int)this.position.Y; 

Плитка Bounds (Прямоугольник)

newTile.bounds = new Rectangle(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE); 

Теперь на том, как он обнаруживает это:

for (int x = 0; x < Tilemap.MAP_WIDTH; x++) 
     { 
      for (int y = 0; y < Tilemap.MAP_HEIGHT; y++) 
      { 

       if (tm.tile[x, y].bounds.Intersects(playerBounds)) 
       { 
        if (tm.tile[x, y].getSolid()) 
        { 
         Colliding = true; 
        } else 
        { 
         Colliding = false; 
        } 
       } 
      } 

     } 

Move

public void Move(Vector2 pos) 
    { 
     for (int i = 0; i < speed; i++) 
     { 

      position += pos; 
     } 

    } 

Я использовал контрольные точки в цикле обнаружения столкновения. И прямоугольник полностью покрывает характер и плитки.

+0

Мое первое предположение заключается в том, что либо A: Maths miscalculation, либо B: ошибка перевода геометрии, приводящая к иллюзии, что она сталкивается, когда на самом деле координат нет. – Krythic

+1

Вы отдаете квадрат из верхнего левого начала? Или это центрированное начало, с вершинами -x/y? Это приведет к визуальной иллюзии столкновения. По существу ваш ограничивающий прямоугольник ниже и больше справа, чем фактический квадрат визуально существует. – Krythic

ответ

1

Вы переопределяете предыдущие столкновения в своем цикле. Результатом всегда будет твердое состояние последней плитки, которая пересекается с игроком. Попробуйте адаптировать так:

Colliding = false; 
for (int x = 0; x < Tilemap.MAP_WIDTH; x++) 
{ 
    for (int y = 0; y < Tilemap.MAP_HEIGHT; y++) 
    { 
     if (tm.tile[x, y].bounds.Intersects(playerBounds) && tm.tile[x, y].getSolid()) 
     { 
      Colliding = true; 
      break;      
     } 
    } 
    if(Colliding) 
     break; 
} 

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

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