C'è un modo semplice per fermare i nemici nello stesso punto?


24

Quindi: gioco dall'alto verso il basso, i miei nemici inseguono il giocatore, quando raggiungono una certa distanza si fermano e sparano. Se provengono tutti dalla stessa direzione finiscono tutti nello stesso punto (cioè in piedi "all'interno" l'uno dell'altro), poiché attualmente non sto rilevando la collisione tra nemici - sono liberi di passare l'uno sull'altro.

Qual è un modo semplice per aggirare questo? O qualche forma di rilevamento delle collisioni o qualche ai?


1
Limitati a un nemico. : P
Kylotan,

Risposte:


18

Non è necessario il rilevamento delle collisioni, ma dovrai dare ai tuoi nemici un po 'di intelligenza e farli evitare di incontrarsi. Il rilevamento delle collisioni senza che ciò farà sembrare stupidi i tuoi nemici comunque - le persone si evitano a vicenda, generalmente non si scontrano.

Cerca "floccaggio" per alcuni comportamenti semplici.

L'idea di base è che le cose dovrebbero andare verso il giocatore, ma lontano da un ostacolo stretto (l'un l'altro, i muri, quel tipo di cose).


6
Si chiama anche chiamato boids. Leggi le semplici regole che circondano le boids qui: en.wikipedia.org/wiki/Boids Dovrebbe essere banale implementare queste restrizioni.
Nailer

12

Potresti ispirarti a comportamenti di floccaggio , come Boids .

Questi tendono a consistere in 3-4 regole molto semplici che, applicate correttamente, risultano in comportamenti molto soddisfacenti e "dall'aspetto complesso".

Nel tuo caso, potresti provare qualcosa del genere:

  • Separazione (raggi minimi tra i nemici)
  • Coesione (quindi viaggiano in gruppo)
  • Allineamento (quindi tendono a muoversi nella stessa direzione)
  • Mirati (dovrebbero tendere a muoversi verso il giocatore)

Questa è quasi una copia integrale della risposta di JasonD. Giuro di non averlo visto prima di pubblicare.
egarcia,


3

Potresti voler controllare la diffusione collaborativa (fantastiche animazioni qui) o qualche altro tipo di modello anti -oggetto per il movimento. Mentre l'algoritmo di diffusione in sé e per sé potrebbe non impedire ai nemici di attraversare, puoi aggiungere ulteriori vincoli per renderlo improbabile o impossibile.


Divulgazione completa: abbastanza sicuro di aver trovato il link di diffusione collaborativa qui da qualche parte su GD, ma per la vita non riesco a trovare il post che si riferisce ad esso ora. È stata una vera scoperta. =)
magro

Questo è super fantastico, ma ho un po 'più di complessità del necessario. Leggerà comunque il white paper ma riuscirà a implementare una soluzione più semplice.
Iain,

2

Cosa succede se non si consente di spostarsi attraverso altre unità? Mi sembra che ne avrai bisogno prima o poi. Ogni volta che il percorso corrente è bloccato da un'unità, regola il percorso per spostarti.


2

C'è qualche riferimento per i comportamenti di governo e di affollamento sul sito web di Craig Reynold . Sono relativamente semplici da implementare ma possono produrre alcuni comportamenti emergenti adorabili.


Questa è essenzialmente la stessa risposta delle altre 2, ma +1 per il link - Quel sito web è un ottimo riferimento.
AShelly,

1

Tutte le altre risposte producono un risultato migliore, ma il modo più economico (?) Per evitare il raggruppamento completo è semplicemente quello di aggiungere un vettore casuale che è forse il 25% del vettore di movimento calcolato originale in modo che gli oggetti rimbalzino un po 'in un gruppo BLOB generale . Non manterrà le cose completamente lontane l'una dall'altra, ma a seconda di ciò che stai cercando di ottenere, ho scoperto che questo può essere adeguato. Gli oggetti possono ancora raggrupparsi con questo metodo se si eseguono cerchi attorno a loro, ma nel tempo tendono a diffondersi.

Ecco un piccolo gioco che ho fatto diversi anni fa che dimostra questo metodo: http://deleter.phatcode.net/index.php?page=projects&p=4


1

Le persone generano sempre boids perché ciò dà ottimi risultati, ma l'implementazione di boids può essere eccessiva per il tuo scopo specifico. In passato ho ottenuto ottimi risultati semplicemente randomizzando la posizione target all'interno di un piccolo cerchio.

Ad esempio, per una demo che ho creato in Unity ho usato il suo comando Random.insideUnitSphere per fare puffball floccati


+1 Sono d'accordo, un altro esempio di questa strategia (con probabilmente una garanzia leggermente migliore di non sovrapposizione) può essere trovato qui: unità "Unclutter" nel gioco RTS
MichaelHouse

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.