2013-11-07 4 views
0

У меня возникают трудности с тем, чтобы мой алгоритм обнаружения столкновений работал правильно. Я читаю данные из .txt, который содержит 0s и 1s (0s - пустые пробелы, которые нельзя пропустить). Мой алгоритм ловит иногда другие времена, когда это не так и в конечном итоге не работает. Мой текущий алгоритм размещен ниже, где sep является значением разделения, чтобы мои духи не перекрывались.C# XNA Обнаружение столкновений

private void collisionDetect() 
{ 
    float diffxleft, diffxright, diffytop, diffybottom; 
    float diffx, diffy; 

    hit = false; 
    foreach (Block b in blocks) 
    { 
     if (hit) 
      break; 
     if (inside(charPos, sep, b)) 
     { 
      hit = true; 
      diffxleft = Math.Abs(charPos.X + sep - b.pos.X); 
      diffxright = Math.Abs(charPos.X - sep - (b.pos.X + b.rect.Width)); 
      diffytop = Math.Abs(charPos.Y + sep - b.pos.Y); 
      diffybottom = Math.Abs(charPos.Y - sep - (b.pos.Y + b.rect.Height)); 
      diffx = Math.Min(diffxleft, diffxright); 
      diffy = Math.Min(diffytop, diffybottom); 
      if (diffx < diffy) 
      { 
       charVel.X = 0; 
       if (diffxleft < diffxright) 
        charPos.X = b.pos.X - sep; 
       else 
        charPos.X = b.pos.X + b.rect.Width + sep; 
      } 
      else 
      { 
       charVel.Y = 0; 
       if (diffytop < diffybottom) 
        charPos.Y = b.pos.Y - sep; 
       else 
        charPos.Y = b.pos.Y + b.rect.Height + sep; 
      } 
     } 
    } 

    foreach (Block b in blocks) 
    { 
     b.disp.X = b.pos.X + 10 - bkgdisplay.X; 
     b.disp.Y = 470 - b.pos.Y; 
    } 
    charPosDisp.X = charPos.X - bkgdisplay.X; 
    charPosDisp.Y = 480 - charPos.Y; 
} 

Помощь!

+0

Не могли бы вы немного понять, что именно не работает? Разве иногда он не обнаруживает X-столкновений или не обнаруживает столкновения Y или оба? Или он обнаруживает столкновения, но не препятствует движению игрока через «пробелы»? – davidsbro

+0

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

ответ

1

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

Скажите, что для каждого блока (или плитки) значение 0 или 1 означает, является ли блок обдираемым или нет. Затем вы можете использовать метод пересечения между положением блока и положением спрайта, чтобы увидеть, пересекаются ли они в настоящее время. Если они пересекаются, а логическое значение для плитки равно 1, то у нас есть столкновение, и вы можете обработать столкновение, то есть остановить перемещение спрайта, отскок назад и т. Д. Если значение равно 0, спрайт может быть перемещен по текущему положение блока.

Это легко реализовать, используя следующий псевдокод.

Шаг 1: Считайте значение для блока и установить логическую переменную-член в классе, чтобы сказать, если это collidable или нет, т.е. Синтаксическая значения из строки, если значение 0, то BOOL = ложь еще BOOL = правда.

Шаг 2: Создан метод в классе блока, чтобы вернуть collidable переменного-члена и который будет делать что-то вроде bool is_collidable() const { return collide; }

Шага 3: Используйте Rectangle.Intersectmethod между спрайтами прямоугольником и блоком прямоугольником.

Шаг 4: После просмотра пересечения между блоком и спрайтом проверьте переменную-член блока, чтобы увидеть, является ли она истиной или ложью.

Шаг 5: Если значение истинно, мы не можем пройти над плиткой, иначе мы сможем.

+0

Я также предлагаю использовать Rectangle.Intersect, потому что он значительно увеличивает вероятность столкновений Полегче. –

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