Wassersimulation im isometrischen Spiel

7

Ich erstelle ein Spiel in Flash AS3, in dem der Spieler das Land ändern muss, um das Wasser in die richtige Richtung zu lenken.

Die Wassersimulation ist jedoch ein neues Thema für mich und ich stecke irgendwie fest. Es muss nicht wie realistisches Wasser sein, mit Wellen und Dingen, aber es muss fließen, und wenn es genug Wasser gibt, muss es steigen.

Ich habe mir zwei verschiedene Arten von Wasser ausgedacht:

  • Eine Quelle: Unendliche Wasserquelle. Wird zur Simulation von Meeren und anderen Dingen verwendet.
  • Wasserblock: Nur eine Einheit Wasser.

Meine aktuelle Implementierung zeigt, wie sich das Wasser ausbreiten soll, aber es steigt nicht an und lässt kein endliches Wasser zu. Außerdem berücksichtigt die Ausbreitung keine Wassermenge, sondern dupliziert nur, anstatt tatsächlich Wassereinheiten zu bewegen.

Ich bin gespannt, wie ihr dieses Problem lösen würdet. Alle Beispiele / Pseudocode werden immer geschätzt.


Aktuelle Version: http://dl.dropbox.com/u/319897/ProjectWater.swf Sie können das Land bearbeiten, indem Sie die linke Maustaste drücken. Und kann durch Drücken von A jeweils einen Schritt Wasser simulieren.

Quelle des Wasserteils: http://pastebin.com/Js2kYt4y

Robin
quelle
Für Überlauf und Druck, die Sie benötigen (eine Annäherung an), um Dinge wie U-Biegungen zu handhaben, sollten Sie die Simulation von Wasser mit einer Höhe (möglicherweise mehr als einen Block hoch) in Betracht ziehen und Blöcke zusammenführen, die direkt übereinander liegen. Natürlich müssten Sie dies wieder in Blöcke für die Anzeige und andere Systeme umwandeln und den "Kopfraum" über jedem Bodenblock sparen.
Martin Sojka
Sie möchten Ihren Wasserblöcken einige Informationen hinzufügen. Viele Informationen können gewonnen werden, wenn Sie wissen, wer der Elternteil des Blocks ist. Sie können die Fließrichtung ermitteln und den Eltern folgen, um die maximale Wasserhöhe zu ermitteln. Wenn Sie dann nicht herausfließen können, überprüfen Sie Ihre Eltern, ob Sie herausfließen können. Darüber hinaus möchten Sie Ihren Blöcken möglicherweise "Wasserstand" hinzufügen, damit sich ein einzelner Würfel, der keine Quelle ist, beim Fließen teilen kann. Siehe auch meinen Kommentar zu Nicks Antwort.
MichaelHouse
Ich habe einen Blog-Beitrag dazu geschrieben und ein Video gepostet, wie mein Flow aussieht . Ich habe nicht auf viele Details eingegangen, da dies für die meisten Leser langweilig wäre. Fühlen Sie sich frei, Fragen zu Einzelheiten zu stellen. Außerdem sollten Sie Nicks Antwort als akzeptiert markieren.
MichaelHouse

Antworten:

7

Sie müssen zellulare Automaten und möglicherweise die Fluiddynamik überprüfen. Tarn Adams hat in Dwarf Fortress ein zellbasiertes Flüssigkeitssystem implementiert. Dies sind die Werkzeuge, die er angeblich in einem Interview verwendet hat, das ich vor einiger Zeit gelesen habe (und auch in drei Dimensionen gemäß Ihrem Anwendungsfall). Ich denke für Ihre Zwecke werden zelluläre Automaten (Selbstreplikation / Vermehrung von Wasserzellen) ausreichen. Zelluläre Automaten sind im Grunde das, was Sie im klassischen Spiel des Lebens von John Conway sehen.

Die schurkenhafte Entwicklergemeinde hat eine Menge Informationen über diese Art von Dingen, da diese Spiele von Natur aus zellbasiert sind. Ich glaube, es gibt irgendwo im Web eine rec.games.roguelike-Mailingliste, auf der Sie detaillierte Informationen erhalten können.

Schlagen Sie außerdem vor, dass Sie sich die Voxeltron-Videos auf Youtube ansehen. Eines davon (es gibt nur etwa 2 oder 3) zeigt flüssige Lava in Bewegung. Wenn Sie ausreichend kleine Subwürfel in Ihrem kubischen Hauptgitter verwenden, können Sie ziemlich kühles, nicht blockierendes Wasser in Gang bringen, indem Sie Sinuswellen und dergleichen für die Oberflächenbewegung verwenden. Noch einmal, für die Verbreitung würden Sie zellulare Automatentechniken verwenden.

Eine Einführung in CAs, überprüfen Sie diese aus.

Ingenieur
quelle
Ich glaube, dies ist der erwähnte Artikel (Wasser ist kurz vor dem Ende). Es ist interessant, schneidet aber ziemlich abrupt ab. Ich arbeite an demselben Problem und habe einen Großteil des Problems gelöst, aber noch keine endgültige Lösung gefunden. Ich verwende etwas Ähnliches wie zellulare Automaten. Ich glaube, das ist deine Antwort . Ich werde einen Beitrag auf meinem Blog schreiben, sobald ich mehr Wasser "ausgespült" habe :)
MichaelHouse
@ Byte56 Dann werde ich dein Blog im Auge behalten!
Robin
1

Ein guter Ansatz könnte eine Flutfüllung sein .

Eine Zeitdimension kann einfach hinzugefügt werden, indem die nominelle Wassermenge in jeder Zelle verfolgt wird und nur die Übertragung eines bestimmten Wasseranteils mit jedem Zeitschritt der Simulation ermöglicht wird. Dieser Anteil könnte gleichmäßig auf benachbarte Zellen auf Wasserbasis in einer Atemzugfüllung aufgeteilt werden. Dieser einfache Ansatz würde bedeuten, dass sich Wasser über Ebenen und Becken und dergleichen füllt.

Wenn Sie als Nebeneffekt hoher Wassertransferraten mit dem Schnitzen von Kanonen oder Flüssen spielen möchten, können Sie auf der Seite eine unterhaltsame Pseudo-Physik-Sim erstellen, die den Spielern gefällt.

Künstlerisch würde dies Ihnen die Möglichkeit geben, Wasserfallblöcke einzubauen, wenn Wasser in Geländehöhe und dergleichen übertragen wird.

Sie könnten es so machen, dass es sowohl Senken als auch Federn gibt, und vielleicht ist der Rand des Bretts eine natürliche Spüle, sonst würde eine Feder schließlich die Karte überfluten.

Wille
quelle