In che modo visualizzare un effetto di "diffusione del muco" in un ambiente 2D?


8

Ecco un esempio di tale diffusione del muco. La sostanza è diffusa intorno alla fonte (in questo esempio, la fonte sarebbe l'edificio alieno principale).

inserisci qui la descrizione dell'immagine

Il gioco è stellare, la sostanza viola si chiama creep.

Come sarebbe possibile ottenere questo tipo di diffusione di sostanze in un ambiente 2D dall'alto verso il basso? Ricalcolare la progressione della sostanza e rigenerare l'effetto al volo ogni fotogramma o piuttosto utilizzare una grande collezione di piastrelle o qualcos'altro?


È difficile dire esattamente cosa stai cercando. Per azzardare un'ipotesi, farei un passaggio attraverso tutte le tessere, e se la tessera è vuota ma ha N tessere confinanti con l'infezione, quindi infettare la tessera corrente.
Jari Komppa,

3
La parola chiave che stai cercando è "automi cellulari".
Marton,


@ Byte56 ottima risposta, abbastanza chiara. Grazie per la condivisione.
Nathan,

Risposte:


7

Secondo il tuo commento nelle altre risposte, il tuo problema non è l'algoritmo di crescita creep, ma piuttosto l'algoritmo che sceglie quale riquadro di scorrimento da usare.

Quale tessera usare dipende se:

  1. la tessera superiore è infetta o meno
  2. la tessera giusta è infetta o meno
  3. la tessera inferiore è infetta o meno
  4. la tessera sinistra è infetta o meno

Ciò significa che avrai bisogno di un totale di 16 tessere. Puoi affrontarli facilmente con un bitfield. Ecco alcuni pseudocodici che sceglieranno una tessera diversa per ogni possibile costellazione di creep:

index = 0;
if left tile is creeped then index += 1
if lower tile is creeped then index += 2
if right tile is creeped then index += 4
if upper tile is creeped then index += 8    
creep_tile = creep_tiles[index]

Si noti che ogni volta che si cambia lo stato di infezione di una tessera, tutte le tessere adiacenti infette devono essere rivalutate, poiché il loro vicinato è ora cambiato.

Come progettare la grafica di 16 tessere in modo che si incastrino perfettamente è una (nuova) domanda per un graphic designer.


1
@nathan Cerca anche gli automi cellulari.
Ingegnere

2

Qualche tempo fa ho letto un articolo di strategia che spiegava in dettaglio come si diffonde il creep in Starcraft 2, sto lottando per trovarlo ora, ma ricordo che è abbastanza semplice e funziona un po 'come questo

  • La mappa di Starcraft 2 è divisa in tessere
  • Per ogni fonte di scorrimento, ogni "segno di spunta" sceglie una tessera casuale a cui è possibile diffondere il creep e che si diffonde su quella tessera
  • Il creep può diffondersi su qualsiasi piastrella
    • Adiacente a un'altra piastrella con scorrimento o adiacente alla fonte del scorrimento
    • Entro un determinato intervallo della fonte del creep
    • Non una scogliera

Il modo più semplice per rintracciare le tessere che si sono diffuse è probabilmente solo una bandiera per ogni tessera - non provare a ricalcolarla ogni turno.

Il tempo tra i "tick" può essere utilizzato per controllare la velocità di diffusione del creep, in alternativa è possibile consentire al creep di diffondersi su più riquadri ogni "tick" o addirittura di randomizzare il tempo tra i tick.

L'algoritmo di cui sopra ha l'effetto che il creep si diffonde più velocemente se è bloccato dalle scogliere su entrambi i lati, tuttavia potresti invece scegliere una tessera casuale nel raggio della sorgente del creep e quindi diffondere il creep su quella tessera solo se non è una scogliera .


Bello ma per quanto riguarda la striscia di una piastrella , l'algoritmo è semplice, anche se ho qualcosa di simile. Ma come ottenere questo effetto naturale e imperfetto usando le tessere?
Nathan,

@nathan Come intendi? Poiché la tessera strisciante viene scelta in modo casuale, la diffusione è imperfetta (al contrario della diffusione in un cerchio perfetto). Il resto viene fatto nel motore grafico scegliendo quali trame dovrebbero essere mostrate per ogni tessera.
Giustino,

Sì, la mia domanda era più su come scegliere quale tessera usare per ottenere un effetto coerente.
Nathan,

1
@nathan Molto probabilmente hanno un sacco di sprite prerendered che, una accanto all'altra nella giusta combinazione, creano l'effetto visivo desiderato.
Panda Pajama,

1
@nathan Probabilmente avrebbe dovuto chiedere come visualizzarlo, piuttosto che come produrlo.
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.