Sto lavorando ad un semplice gioco 2D in cui molti nemici continuano a generare e inseguire il giocatore oi giocatori in python + pygame. Un problema che ho incontrato e che molte persone che hanno programmato questo tipo di gioco hanno incontrato è che i nemici convergono molto rapidamente. Ho fatto una soluzione temporanea a questo problema con una funzione che allontana a caso due nemici a caso se sono troppo vicini l'uno all'altro. Funziona bene ma riguarda un algoritmo O (n^2) che viene eseguito ogni fotogramma e nei nemici alti il programma inizia a rallentare.dirigere una massa di nemici alla volta
Quando il mio programma viene eseguito con questa funzione, i nemici sembrano formare un oggetto rotondo che ho soprannominato un "grumo". Il grumo sembra di solito in eclittica, ma può essere in realtà più complesso (non simmetrico) perché quando il giocatore si muove i nemici vengono tirati in direzioni diverse. Mi piace il modo in cui si comporta questo grumo, tuttavia mi chiedo se esiste un modo più efficiente per calcolarlo. Attualmente ogni nemico nel gruppo (spesso> 100) viene prima mosso nella direzione del giocatore, e poi spinto a parte. Se invece ci fosse un modo per calcolare la figura creata dal gruppo, e come si muove, si risparmia un sacco di calcoli.
Non sono esattamente sicuro di come affrontare il problema. Potrebbe essere possibile calcolare il punto in cui si sposta il bordo della figura, quindi espanderlo per accertarsi che l'area rimanga invariata.
Anche i miei due funzioni attualmente utilizzate per spostare i nemici:
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: alcuni colpi di schermo di come il ciuffo sembra: 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/
Il ciuffo sembra essere principalmente un oggetto rotondo appena allungato (come un'eclissi ma può essere allungato in più direzioni), tuttavia curre ha i bordi dritti a causa dei nemici rettangolari.
E il codice per il raggio d'azione? Sta facendo il controllo della distanza? Questo può essere molto costoso per un gran numero di unità. –
Inoltre, non fare questo ogni fotogramma ma piuttosto ogni X fotogramma. Ho risolto lo stesso problema in modo simile, tuttavia ho permesso qualche sovrapposizione. Fa sembrare più pericoloso lo sciame di massa! –
A seconda della qualità delle risposte che si ottiene, si potrebbe anche provare a chiedere questo su http://gamedev.stackexchange.com/. –