2010-07-13 2 views
0

Я работаю над простой 2D-футбольной игрой, пропуская мяч между моими игроками, я хотел бы проверить, может ли кто-либо из вражеских игроков перехватить мяч, что я хотел бы сделать, это рассчитать список координат между своими игроками коридор, так сказать, а затем проверить, если любые вражеские игроки в этом регионе,Расчет области между спрайтами

 
-------------------------- 
S      S 
-------------------------- 

легко вычислить площадь между Ss, когда они лежат, как это, но как я могу вычислить региона, когда они не выровнены,

 
     /S/
    // 
    // 
    // 
// 
// 
/S/ 

EDIT: Когда Я имею в виду область, мне нужен список координат в этом регионе, чтобы я мог проверить эти координаты на координатах игроков, а не на величину области.

ответ

1

(image) http://img441.imageshack.us/img441/9051/soccer.png

Показать враг находится между красными линиями: Calculate the distance противника на линию, образованную двумя игроками (пунктирная линия). Если это <= w/2(w - это ширина вашего «региона»), то либо враг находится в пределах региона, либо за одним из игроков.

Показать враг находится между оранжевыми линиями: Для того, чтобы проверить, что он не за одним из игроков, просто проверить, что он between the two lines, которые проходят через один из игроков и normal (perpendicular) на первую строчку (в пунктирная линия, проходящая через обоих игроков).

Это скажет вам, если враг находится в желтом регионе:

0

Если это только должно быть приблизительным, и вам нужно рассчитать его быстро, а затем оцените «диаметр» вашего объекта (даже если это квадрат) и умножьте расстояние между их центрами (минус 1 радиус на каждом конец для всего 1 диаметра). Это будет быстро и довольно близко.

Обновление: неверно сформулировал вопрос, я думал, что вы буквально хотите «область».

Вы все еще можете приблизить его, как указано выше, но определите боковые точки как точки на воображаемых кругах, на 90 градусов от линии, соединяющей две. Опять же, он приблизительный, но он не позволяет вам рассчитывать «ближайшую сторону объекта» и «ближайшие точки к линии».

Update 2:

На самом деле, даже лучше: сортировать точки S1 в порядке, как далеко они находятся от центра S2. Выберите второй и третий ближайшие. Отсортируйте точки S2 в порядке их расположения от центра S1. Выберите второй и третий ближайшие. Это 4 вершины. Ближайшим «первым» является тот, который непосредственно указывает на другой объект, поэтому 2-й и 3-й являются «боковыми», с точки зрения обращения к другому объекту.

+0

обновлено ........ – eruciform

1

Почему бы вам не повернуть вашу систему координат так, чтобы оба игрока были выровнены? Предполагая, что у вас есть фиксированное количество игроков (22 для примера), вы умножаете каждую из своих (x, y) координат в матрице с переводом + перевод, которая делает S1 (или S2, на самом деле не имеет значения), выровненными со своим компаньоном.

И вы можете вычислить матрицу вращения от этой простой формуле: http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_given_an_axis_and_an_angle Дальнейшего объяснения и хороший пример: http://www.quantunet.com/flash8/knowledgebase/actionscript/advanced/matrix/matrix_rotation.html

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