2010-10-22 7 views
6

Tengo un juego basado en cuadrículas (plataformas) en el que he basado todo en mosaicos. Tengo fichas que son sólidas y líquidas. Estoy tratando de encontrar una buena manera de hacer que las baldosas de agua simulen el agua de una manera aproximada.Simulación en 2D de agua/líquido en cuadrículas (basado en fichas de plataformas)

Por el momento tengo el sistema actual: Cuando se agrega una baldosa de agua sobre otra baldosa de agua, agrega 1 a la baldosa de agua a continuación. El número indica la presión.

Así es como parece en la actualidad

[0] <- This water tile has 0 in pressure. 
[1] <- This water tile has 1 in pressure. 

si añado otra ficha agua al lado de la de abajo, efectúa la búsqueda de izquierda, derecha y arriba si hay casillas de agua y inheritates el mayor presión a su alrededor.

Ejemplo:

[0] 
[1][1] 

Y aquí es un ejemplo más grande después de la adición de algunas casillas de agua:

[0][0] 
[1][1][1][1] 
[2][2][2][2][2] 

Entonces hago cada azulejo agua que tiene una presión que es igual o mayor que 1 intenta mover izquierda/derecha si hay espacio libre, luego ajuste la presión a 0 y verifique si puede heredar la presión alrededor de las baldosas vecinas si hay alguna.

Este sistema funciona muy bien, excepto en el caso en que las baldosas de agua se eliminan de la parte superior.

Si quito las casillas de agua superiores desde el último ejemplo:

[1][1][1][1] 
[2][2][2][2][2] 

entonces tenemos la fila superior a la presión 1, debe tener 0 en la actualidad y la fila inferior debe tener 1.

¿Existe algún sistema más inteligente que pueda implementar para hacer esto de forma más adecuada?

Las siguientes son las restricciones:

Cada mosaico sólo puede comprobar sus vecinos azulejos. El mosaico puede tener cualquier función definida. El mosaico puede tener cualquier variable para almacenar datos.

¿Pueden encontrar un mejor sistema que funcione mejor que el mío?

El caso de prueba habitual que hago es:

[] 
[] should become [][] 

[] 
[] 
[] should become [][][] 

    [] 
[][][] should become [][][][] 

Suponiendo que el juego se ejecuta por un tiempo.

¡Cualquier sugerencia sería más que bienvenida!

Respuesta

0

Quizás pueda olvidarse de las presiones (ya que realmente no las está utilizando como presiones) y simplemente use un bool tryMove o algo así.

Cada paso de simulación debe ser roto en dos sub-etapas:

primer bucle de azulejos:

  1. Si el espacio de abajo es libre, establecer tryMove true, terminar esta baldosa.
  2. Si tiene el mosaico de arriba, establezca tryMove en verdadero else establezca tryMove en false.
  3. Si algún vecino está intentando moverse, establezca tryMove en verdadero.

segundo bucle de azulejos:

  1. Si tratando de mover y espacio de abajo es libre, mover baldosas abajo, establece tryMove en false, el azulejo acabado.
  2. Si intenta moverse y se puede mover hacia los lados (espacio libre hacia la izquierda o hacia la derecha) configure los vecinos tryMove como falso, muévalo, establezca este tryMove como falso, termine el mosaico.

Creo que esto debería solucionar su problema.

0

Si tiene los recursos para admitirlo, recomiendo una función recursiva que intente empujar las teselas hacia la izquierda y hacia la derecha desde arriba. Si la función encuentra otro mosaico debajo, puede intentar desplazar ese mosaico hacia cualquier lado. El mejor método sería comenzar a caminar de izquierda a derecha, una ficha a la vez. Si sigue buscando baldosas de agua, sigue funcionando. Eventualmente se quedará sin fichas para verificar (termina en una pared) o encontrará una baldosa de agua con espacio libre para moverse. Después de múltiples iteraciones, el agua debe empujar hacia afuera y dejar espacio para que caiga el agua más alta.

Permítanme reclarificar la naturaleza izquierda y derecha de la recursión. Esencialmente, una vez que la función llega al nivel base del agua, debe comenzar a elegir azulejos de agua, alternando a la izquierda y a la derecha. Por lo tanto, primero verificará el mosaico directamente a la izquierda, luego directamente a la derecha, luego dos a la izquierda, luego dos a la derecha, etc. Si encuentra una loseta de aire, debe hacer un desplazamiento de la baldosa de agua más cercana. Si encuentra algo más (normalmente una pared), debe abandonar ese lado. Una vez que se abandona en ambos lados, debe considerar otros comportamientos en su lugar, como el agua más alta que viaja aleatoriamente por la superficie.

Si realmente quiere que el comportamiento parezca natural, le recomiendo una variable aleatoria que decida si primero se va a la izquierda o a la derecha. De lo contrario, probablemente termines con patrones recurrentes extrañamente regulares.

Cuestiones relacionadas