Я работаю над простой 2-й игрой, в которой много врагов постоянно появляются и преследуют игрока или игроков в игре python + pygame. Проблема, с которой я столкнулся, и многие люди, которые запрограммировали этот тип игры, столкнулись с тем, что враги сходятся очень быстро. Я сделал временное решение этой проблемы с помощью функции, которая толкает любых двух врагов случайным образом, если они слишком близки друг к другу. Это хорошо работает, но это алгоритм O (n^2), который запускается каждый кадр и у высоких врагов программа начинает замедляться.направляет массу врагов сразу
Когда моя программа работает с этой функцией, враги, похоже, образуют круглый объект, который я называю «скоплением». Скопление кажется обычно эклиптическим, но может быть более сложным (не симметричным), потому что, когда игрок движется, враги тянутся в разных направлениях. Мне нравится, как ведет себя этот clump, однако мне интересно, есть ли более эффективный способ его вычисления. В настоящее время каждый враг в скоплении (часто> 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)<CLUMP:
xChange = (random.random()-.5)*CLUMP
yChange = ((CLUMP/2)**2-xChange**2)**.5
enemys[p] = enemys[p].move(int(xChange+.5), int(yChange + .5))
enemys[p+q+1] = enemys[p+q+1].move(-int(xChange+.5),-int(yChange+.5))
return enemys
Edit: некоторые снимки экрана, как глыба выглядит: 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/
скопление, кажется, в основном круглый объект просто растягивается (как затмение, но может растягиваться в разных направлениях), однако Curre ntly имеет прямые края из-за прямоугольных врагов.
Как насчет кода диапазона? Это делает проверку дистанции? Это может быть очень дорого для большого количества единиц. –
Кроме того, не делайте этого каждый кадр, а скорее каждый X-кадров. Я решил эту же проблему аналогичным образом, однако я допустил некоторое перекрытие. Это делает массовый рой более опасным! –
В зависимости от качества ответов, которые вы получаете здесь, вы также можете попросить об этом на http://gamedev.stackexchange.com/. –