Estoy trabajando en un simple juego de 2d en el que muchos enemigos continuamente engendran y persiguen al jugador o jugadores en python + pygame. Un problema con el que me topé, y con el que muchas personas han programado este tipo de juegos, es que los enemigos convergen muy rápido. He creado una solución temporal a este problema con una función que aleja a dos enemigos al azar si están demasiado cerca el uno del otro. Esto funciona bien, pero se trata de un algoritmo O (n^2) que se ejecuta en cada cuadro y en enemigos altos el programa comienza a ralentizarse.dirigiendo una masa de enemigos a la vez
Cuando mi programa se ejecuta con esta función, los enemigos parecen formar el objeto redondo apodado un "grupo". El grupo parece usualmente eclíptico, pero en realidad puede ser más complejo (no simétrico) porque a medida que el jugador se mueve los enemigos son arrastrados en diferentes direcciones. Me gusta la forma en que se comporta este grupo, sin embargo, me pregunto si existe una forma más eficiente de calcularlo. Actualmente, todos los enemigos del grupo (a menudo> 100) primero se mueven en la dirección del jugador y luego se separan. Si hubiera, en cambio, una forma de calcular la cifra que crea el grupo, y cómo se mueve, se ahorraría una gran cantidad de cálculos.
No estoy seguro de cómo abordar el problema. Es posible calcular dónde se mueve el borde de la figura y luego expandirlo para asegurarse de que el área permanezca igual.
también actualmente mis dos funciones que se utilizan para mover los enemigos:
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
Editar: algunas capturas de pantalla de cómo se ve el grupo: 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/
El grupo parece ser principalmente un objeto redondo simplemente estirada (como un eclipse pero puede ser estirado en múltiples direcciones), sin embargo, Curre ntly tiene bordes rectos debido a los enemigos rectangulares.
¿Qué hay del código para el rango? ¿Eso está haciendo la comprobación de distancia? Eso puede ser muy costoso para una gran cantidad de unidades. –
Además, no hagas esto en cada cuadro, sino en cada X cuadros. Resolví este mismo problema de una manera similar, sin embargo, permití cierta superposición. ¡Hace que el enjambre de masas se vea más peligroso! –
Dependiendo de la calidad de las respuestas que obtenga aquí, también puede intentar preguntar esto en http://gamedev.stackexchange.com/. –