Я работаю над простой 2D-игрой, в которой постоянно появляется множество врагов и преследует игрока или игроков в python + pygame. Проблема, с которой я столкнулся, и с которой столкнулись многие люди, программировавшие игры такого типа, заключается в том, что враги сходятся очень быстро.Я сделал временное решение этой проблемы с помощью функции, которая случайным образом раздвигает любых двух врагов, если они находятся слишком близко друг к другу. Это работает хорошо, но это алгоритм O(n^2), который запускается каждый кадр, и при большом количестве врагов программа начинает замедляться.
Когда моя программа запускается с этой функцией, кажется, что враги образуют круглый объект, который я назвал «сгустком». Сгусток кажется обычно эклиптичным, но на самом деле может быть более сложным (не симметричным), потому что, когда игрок движется, врагов тянет в разные стороны. Мне нравится, как ведет себя этот комок, однако мне интересно, есть ли более эффективный способ его вычисления. В настоящее время каждый враг в группе (часто > 100) сначала перемещается в направлении игрока, а затем раздвигается. Если бы вместо этого был способ вычислить фигуру, которую создает комок, и то, как он движется, это сэкономило бы много вычислений.
Я не совсем уверен, как подойти к проблеме. Возможно, удастся рассчитать, где перемещается граница фигуры, а затем расширить ее, чтобы убедиться, что область остается неизменной.
Также мои две функции в настоящее время используются для перемещения врагов:
def moveEnemy(enemy, player, speed):
a = player.left-enemy.left
b = player.top-enemy.top
r = speed/math.hypot(a,b)
return enemy.move(r*a, r*b)
def clump(enemys):
for p in range(len(enemys)):
for q in range(len(enemys)-p-1):
a = enemys[p]
b = enemys[p+q+1]
if abs(a.left-b.left)+abs(a.top-b.top)
Редактировать: несколько скриншотов того, как выглядит группа: http://imageshack.us/photo/my-images/651/elip.png/ http://imageshack.us/photo/my-images/832/newfni.png/
http://imageshack.us/photo/my-images/836/gamewk.png/
Комок кажется быть в основном круглым объектом, только что растянутым (как затмение, но может быть растянутым в нескольких направлениях), однако в настоящее время он имеет прямые края из-за прямоугольных врагов.