наведение массы врагов сразу

Я работаю над простой 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/

Комок кажется быть в основном круглым объектом, только что растянутым (как затмение, но может быть растянутым в нескольких направлениях), однако в настоящее время он имеет прямые края из-за прямоугольных врагов.

9
задан enderx1x 20 March 2012 в 12:07
поделиться