Question

Il faut espérer que ce sera assez clair.

J'ai une carte 2d de tuiles, et je veux « eau » de voyager à travers cette carte. Il sort d'un tuyau sur une tuile spécifique et doit ensuite remplir, comme l'eau, toutes les tuiles pour atteindre une certaine autre tuile. J'ai actuellement la carte entrée dans le jeu avec chaque tuile étant un noeud et chaque noeud ayant des connexions à toutes les tuiles appropriées autour d'elle. Je les noeuds stockés dans un tableau trié, d'abord en x, puis en y. De plus, quelques tuiles sont des tuiles « de porte », ce qui peut empêcher l'eau de circuler à travers eux. Ceux-ci font partie de la même grille de carreaux de noeuds et sont simplement marqués lorsqu'ils sont actifs.

Le problème est de savoir comment j'évacuent l'eau.

Dans un premier temps j'avais chaque tuyau (ce qui laisse tomber l'eau) garder la trace d'une liste de tuiles d'eau « courante » et « complet », et il se dispersaient l'eau directement sur les tuiles « actuelles », puis les passer à son « plein «liste le cas échéant. La liste « actuelle » a été élargie en obtenant des carreaux autour des tuiles déjà « en cours ». Dans tous les cas, cela a bien fonctionné, et l'eau coulait bien, mais je ne pouvais pas comprendre comment le faire fonctionner avec les portes de sorte que l'écoulement de l'eau pourrait être arrêté et réaccepté, (et arrêté à nouveau, etc.) à un moment précis.

En ce moment, je l'ai où les décharges d'eau en une seule et une seule tuile, puis en une tuile a trop d'eau, il pousse l'eau progressivement sur une tuiles voisines au hasard (à moins que la tuile est une porte active.) La problème est que l'eau « clapote » autour déjà remplies tuiles au lieu de couler « vers l'extérieur. » Il va y arriver par la suite, mais le débit est beaucoup moins naturel.

conclut mon dilemme.

Le code est écrit en python.

Edit: Nouvelle idée. Je pourrais avoir la recherche de tuyaux à travers les nœuds pour une tuile libre approprié pour placer l'eau chaque mise à jour, mais cela semble terriblement inefficace -. En particulier avec plusieurs tubes

Était-ce utile?

La solution

revient beaucoup dans le développement du jeu - il y a eu beaucoup de discussions GDC et Gamasutra / jeu des articles de fond magazine Developer sur ce sujet. Le mieux à vos besoins, je pense est Jos Stam » s " noreferrer en temps réel la dynamique des fluides pour les jeux " de la GDC 2003.

Il décrit une façon simplifiée d'effectuer advection par backtrace linéaire qui souffre de certains problèmes, mais fonctionne très bien pour les fluides incompressibles (c'est-à-dire qu'il fonctionne mieux pour l'eau que pour le gaz). backtrace linéaire signifie essentiellement qu'il met en place une grille représentant la densité du fluide à chaque point dans l'espace (c'est vos tuiles), puis pour chaque visite de cadre chaque point et demande, « en fonction de la pression aux points environnants, où est le fluide probable viennent de ? » Cela se révèle être plus facile que de le résoudre dans l'autre sens ( « où est le fluide de ce point va aller? »).

article sur la dynamique des fluides de Mick Ouest pour Gamasutra étend le papier de Stam à certains égards, qui peuvent améliorer les performances, vous voudrez peut-être commencer par là.

Il y a aussi un article récent gamedev parrainé par Intel qui offre une plus complète solution , mais il est assez compliqué et plus axé sur le côté de rendu graphique en 3D.

Vous pouvez regarder DwarfFortress pour un exemple de la mécanique des fluides carrelés 2d, mais sa solution semble avoir un tas de problèmes à traiter avec des fluides à débit rapide ou sous pression; parfois son eau se déplace de manière plus paresseusement que vous attendez, ou est pris dans des blocs et des coins.

Ces documents résument la façon mathématique et algorithme mieux que je pouvais fourrer dans une boîte débordement de pile, mais il y a deux points généraux que je voudrais faire aussi:

  1. Simulation de l'eau est très cher informatiquement. Puisque vous travaillez en Python, cela peut entraîner un réel problème de performance - assurez-vous de mettre en place des moyens de profilage de votre algorithme pour trouver les points chauds dans le cas où votre boucle prend tellement de temps qu'il tue framerate. Vous pouvez avoir recours à numérique Python pour obtenir des opérations de tableau à base de C-rapide.
  2. Il y a beaucoup plus de mathématiques dans le développement de jeu que la plupart des gens attendent!

Autres conseils

Quelques heuristiques sur les hypothèses suivantes:

  • discret « gouttes » qui occupent exactement un carré chaque
  • l'eau ne reste jamais plus d'un haut sur une tuile donnée,
  • l'eau reste toujours continue
  • lorsque les barrières sont en place, ils sont comme des murs
  • lorsque les barrières ne sont pas, ils sont comme des places ouvertes

Pour chaque flaque d'eau, maintenir une liste des places de bord et les places ouvertes à côté des bords.

Quand une barrière descend

amend the lists of edge and open squares for any puddles that were touching it

Quand une barrière monte

if (it was covered)
    pick a non-wall square next to it at random, and add the drop from the barrier there.
amend the lists of edge and open squares for any puddles next to the block

Lorsque vous ajoutez une goutte:

if (the square "under" the pipe is empty)
   fill it
else
   consult the list of edge square associated with the pool under the pipe, and select the one closest to the pipe (if more than one is closest, choose from the candidates at random), and fill it.  
amend the lists of edge and open squares for the puddle (be prepared to merge with neighboring puddles if necessary)

Lorsque vous supprimez une goutte

 find the edge (not open!) square farthest from the sink (or randomly select from the equivalent candidates), and empty it
 amend the lists of edge and open squares for the puddle

(jabot ici est de rendre le « plus loin » délimitée par une distance égale à d'autres puits, de sorte que les places au milieu d'une flaque d'eau peuvent se vident si elles sont entre les puits)

Ce n'est pas très réaliste, et ne reçoit pas vous une dynamique à proprement parler, mais maintiendra les flaques d'eau en continu « sous » les conduites d'égouttage et remplir l'espace disponible coulures assez donné.

Votre modèle inclut un concept de différence de potentiel ou de pression?

Dis une case vide a une pression nulle, une tuile entière sous une pression de 10. Si theres un tuyau entre deux tuiles puis circule de l'eau afin d'égaliser la pression, une grille ferme un tuyau afin de laisser circuler rien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top