Simulação de água no jogo isométrico

7

Estou criando um jogo no Flash AS3 no qual o jogador precisa modificar a terra para direcionar a água na direção certa.

No entanto, a simulação de água é um novo tópico para mim e estou meio que preso. Não precisa ser como água realista, com ondulações e outras coisas, mas precisa fluir e, se houver água suficiente, precisa subir.

Eu pensei em dois tipos diferentes de água:

  • Fonte: Fonte infinita de água. Usado para simular mares e outras coisas.
  • Bloco de água: Apenas uma unidade de água.

Minha implementação atual mostra como eu gostaria que a água se espalhasse, mas ela não sobe e não permite a água finita. Além disso, a propagação não é responsável por nenhuma quantidade de água, apenas se duplica ao invés de realmente mover unidades de água.

Estou curioso para saber como vocês resolveriam esse problema. Qualquer exemplo / pseudo-código é sempre apreciado.


Versão atual: http://dl.dropbox.com/u/319897/ProjectWater.swf Você pode manipular a terra pressionando o botão esquerdo do mouse. E pode simular um passo de água por vez, pressionando A.

Fonte da parte de água: http://pastebin.com/Js2kYt4y

Robin
fonte
Para transbordamento e pressão, dos quais você precisaria (uma aproximação de) para lidar com coisas como curvas em U, considere simular a água como tendo uma altura (potencialmente mais de um bloco de altura) e mesclar blocos que estão diretamente acima um do outro. Obviamente, você precisaria transformá-lo novamente em blocos para exibição e outros sistemas e salvar a "sala principal" acima de cada bloco de piso.
Martin Sojka
Você deseja adicionar algumas informações aos seus blocos de água. Muita informação pode ser obtida se você souber quem é o pai do bloco. Você pode obter a direção do fluxo e seguir os pais até encontrar a altura máxima em que a água pode ir. Então, se você não consegue fluir, verifique seus pais para ver se você consegue fluir. Além disso, você pode adicionar "nível de água" aos seus blocos, para que, quando um único cubo sem fonte esteja fluindo, ele possa se dividir para fluir. Veja meu comentário sobre a resposta de Nick também.
Michaelhouse
Eu escrevi um post sobre isso e postei um vídeo de como meu fluxo se parece . Não entrei em muitos detalhes específicos, pois isso seria entediante para a maioria dos leitores. Sinta-se à vontade para fazer qualquer pergunta sobre detalhes. Além disso, você deve marcar a resposta de Nick como aceita.
Michaelhouse

Respostas:

7

Você precisa verificar autômatos celulares e, possivelmente, dinâmica de fluidos. Tarn Adams implementou um sistema de fluidos baseados em células no Dwarf Fortress, e essas são as ferramentas que ele afirmou usar em uma entrevista que li há algum tempo (e também em três dimensões, conforme o seu caso de uso). Penso que, para seus propósitos, autômatos celulares (auto-replicação / propagação de células de água) serão suficientes. Autômatos celulares são basicamente o que você vê no clássico jogo da vida de John Conway.

A comunidade de desenvolvimento roguelike tem uma tonelada de informações sobre esse tipo de coisa, porque esses jogos são inerentemente baseados em células. Acredito que exista uma lista de correspondência rec.games.roguelike em algum lugar no webz, onde você pode obter informações detalhadas.

Sugira também que você confira os vídeos do Voxeltron no youtube, um deles (existem apenas 2 ou 3) mostra lava líquida em movimento. Se você usasse subcubos pequenos o suficiente dentro de sua grade cúbica principal, poderia obter água não-bloqueada bem fria, usando ondas senoidais e similares para o movimento da superfície. Mais uma vez, para propagação, você usaria técnicas de autômatos celulares.

Para uma introdução às autoridades de certificação, verifique isso .

Engenheiro
fonte
Eu acredito que este é o artigo mencionado (a água está chegando ao fim). É interessante, mas corta abruptamente. Estou trabalhando no mesmo problema e resolvi muito do problema, mas ainda não resolvi a solução final. Estou usando algo semelhante ao autômato celular. Então eu acredito que esta é sua resposta . Eu vou fazer um post no meu blog uma vez que tenho mais água "fora lavada" :)
Michaelhouse
@ Byte56 Vou ficar de olho no seu blog então!
Robin
1

Uma boa abordagem pode ser uma inundação .

Uma dimensão de tempo pode ser facilmente adicionada, rastreando a quantidade nominal de água em cada célula e permitindo apenas a transferência de uma certa proporção de água a cada passo temporal da simulação. Essa proporção pode ser dividida igualmente entre as células vizinhas à base de água em um preenchimento pela respiração. Essa abordagem simples significa que a água enche as planícies e enche bacias e tal.

Se você quer jogar cânones ou rios de escultura como um efeito colateral de altas taxas de transferência de água, você pode criar um simulador de física psuedo divertido do lado que será agradável para os jogadores.

Artisticamente, isso lhe daria a oportunidade de colocar blocos de cascata se a água estiver transferindo na altura do terreno e tal.

Você poderia fazê-lo para que houvesse pias e fontes, e talvez a borda do quadro seja uma pia natural; caso contrário, uma fonte acabaria inundando o mapa.

Vai
fonte