Выравнивание осей ограничивающих прямоугольников: какие стороны сталкиваются - PullRequest
2 голосов
/ 05 февраля 2011

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

Пока у меня есть тривиальный алгоритм обнаружения столкновений, но мне нужно знать, с какой стороны каждого кирпича попадает мяч. Например: Collision cases

Пока у меня есть алгоритм, который проверяет, были ли поражены все стороны:

up = left = right = down = 0;

if(mouse.left < brick.left && brick.left < mouse.right && mouse.right < brick.right){   
    left = 1;
}

if(brick.left < mouse.left && mouse.left < brick.right && brick.right < mouse.right){
    right = 1;
}

if(mouse.top < brick.top && brick.top < mouse.bottom && mouse.bottom < brick.bottom){
    up = 1;
}

if(brick .top < mouse.top && mouse.top < brick.bottom && brick.bottom < mouse.bottom){
    down = 1;
}

Но в столкновениях вблизи углов, как и на третьем изображении, два флага (например, влево и вниз) установлены в 1, поэтому я не знаю, как решить.

Что обычно делается в этих случаях?

1 Ответ

2 голосов
/ 05 февраля 2011

Не просто установите его на единицу, установите глубину проникновения:

// why is it named mouse?
if(mouse.left < brick.left && brick.left < mouse.right &&
    mouse.right < brick.right)
{
    left = mouse.right - brick.left;
}

// and so on...

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


Кстати, я не думаю, что вы хотите это третье условие. Представьте себе случай, подобный этому:

   +-+
   |B|
+--| |--+
|M | |  |
|  | |  |
+--| |--+
   +-+

Здесь у вас нет ни левого, ни правого столкновения.

(Вы также можете проверить правильность оставшихся условий).

...