¿Cómo mostrar un efecto de "diseminación de moco" en un entorno 2D?

8

Aquí hay un ejemplo de tal propagación de moco. La sustancia se extiende alrededor de la fuente (en este ejemplo, la fuente sería el edificio alienígena principal).

ingrese la descripción de la imagen aquí

El juego es Starcraft, la sustancia púrpura se llama creep.

¿Cómo se lograría este tipo de propagación de sustancias en un entorno 2D de arriba hacia abajo? ¿Recalcular la progresión de la sustancia y regenerar el efecto sobre la marcha cada fotograma o más bien usar una gran colección de fichas o algo más?

Nathan
fuente
Es difícil decir exactamente lo que buscas. Para arriesgarme a adivinar, pasaría por todas las fichas, y si la ficha está vacía pero tiene N fichas que bordean con infección, entonces infectaría la ficha actual.
Jari Komppa
3
La palabra clave que está buscando es "autómata celular".
Marton
1
Relacionado: choose-tile-based-on-adyacente-tiles
MichaelHouse
@ Byte56 gran respuesta, bastante claro. Gracias por compartir.
nathan

Respuestas:

7

De acuerdo con su comentario en las otras respuestas, su problema no es el algoritmo de crecimiento progresivo, sino el algoritmo que elige qué mosaico de crecimiento utilizar.

Qué mosaico usar depende de si:

  1. la baldosa superior está infectada o no
  2. el azulejo correcto está infectado o no
  3. el azulejo inferior está infectado o no
  4. el azulejo izquierdo está infectado o no

Eso significa que necesitará un total de 16 fichas. Puede abordarlos fácilmente con un campo de bits. Aquí hay un pseudocódigo que elegirá un mosaico diferente para cada constelación de fluencia posible:

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]

Tenga en cuenta que siempre que cambie el estado de infección de un mosaico, todos los mosaicos adyacentes infectados deben ser reevaluados, porque su vecindario ahora ha cambiado.

Cómo diseñar los 16 gráficos de mosaico para que encajen bien es una (nueva) pregunta para un diseñador gráfico.

Philipp
fuente
1
@nathan También busque Autómatas celulares.
Ingeniero
2

Hace un tiempo leí un artículo de estrategia que explicaba en detalle cómo se propaga el creep en Starcraft 2, estoy luchando por encontrarlo ahora, pero recuerdo que es bastante simple y funciona un poco así

  • El mapa de Starcraft 2 está dividido en mosaicos
  • Para cada fuente de fluencia, cada "tick" elige un mosaico aleatorio que sea elegible para que el fluencia se extienda y esparza el fluencia sobre ese mosaico.
  • La fluencia puede extenderse a cualquier pieza que sea
    • Adyacente a otra loseta con arrastre o adyacente a la fuente del arrastre
    • Dentro de un rango dado de la fuente de fluencia
    • No es un acantilado

La forma más fácil de rastrear a qué fichas se ha extendido el arrastramiento es probablemente solo una bandera para cada ficha: no intentes volver a calcularla cada turno.

El tiempo entre "ticks" se puede usar para controlar la velocidad de propagación de la fluencia, de forma alternativa, puede permitir que la fluencia se extienda a varias fichas cada "tick", o incluso aleatorizar el tiempo entre ticks.

El algoritmo anterior tiene el efecto de que la fluencia se propaga más rápido si está bloqueada por acantilados a ambos lados, sin embargo, en su lugar, puede elegir una ficha aleatoria dentro del rango de la fuente de la fluencia y luego solo extender la fluencia a esa loseta si no es un acantilado .

Justin
fuente
Agradable, pero ¿qué hay de arrastrar un mosaico? El algoritmo es simple, creo que es algo similar. Pero, ¿cómo obtener este efecto natural e imperfecto con azulejos?
nathan
@nathan ¿Qué quieres decir? Debido a que el mosaico rastrero se elige al azar, la extensión es imperfecta (en lugar de extenderse en un círculo perfecto). El resto se realiza en el motor gráfico eligiendo qué texturas se deben mostrar para cada mosaico.
Justin
Sí, mi pregunta era más sobre cómo elegir qué mosaico usar para obtener un efecto coherente.
nathan
1
@nathan Lo más probable es que tengan muchos sprites prerrepresentados que, cuando se colocan uno al lado del otro en la combinación correcta, crean el efecto visual deseado.
Panda Pyjama
1
@nathan Probablemente debería haber preguntado cómo mostrarlo, en lugar de cómo producirlo.
MichaelHouse