2D Plattformer Terrain Generator

    • GM 8

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • 2D Plattformer Terrain Generator

      Hallo alle zusammen!

      Ich wende mich nun an euch, da ich bei sehr langen suchereien im Internet nichts wirklich in Erfahrung bringen konnte.
      Es geht um einen 2D Terrain/Map Generator. Es gab dieses Thema sicher schon desöfteren hier im Forum.
      Ich würde jedoch einen Generator für Plattformer Games programmieren.
      Dies ist im Internet auch sehr selten aufzutreffen. Daher habe ich auch keine Algorithmen gefunden die mir helfen könnten.

      Was ich NICHT haben möchte ist ein vollständig gescripteter Code. ES GEHT MIR HIER NUR UM REINE THEORIE!
      Wo wäre der richtige Ansatz. Wie könnte man so etwas umsetzen?

      Hoffe ihr habt die ein oder andere Idee wie so ein 2D Generator vom Ansatz her funktionieren könnte.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()

    • Ich denke mal das würde mit einer Version von einem Eindimensionalen Perlin gehen, dabei stehen die Werte für die y Koordinate, für Höhlen oder ähnliches könntest du wie ein Wurm dich zufällig durch die Welt graben.
      Für die Hügeln kann aber auch folgende Idee nehmen:
      Du beginnst vom Spawn (von einer festen Position also), und gehts dann per Zufall hoch oder mal runter:
      wenn random(1) gleich 1 dann gehe random (3) runter
      wenn nicht gehe random(3) hoch
      Für Seen/Meere kannst du einfach vor den Höhlen alles ausfüllen was unter <Wasserspiegel liegt mit Wasser aus. Dann gehts du wie ein Wurm zufällig in verschiedene Richtungen und endest z.B. irgendwann z.B. an der Oberfläche das machst du dann mehrmals und dann könnten tolle Höhlen entstehen. Bei 3D ist das noch mehr komplexer aber ich hab die Wasser/hoch-runter Geschichte auch für CraftGM verwendet da man dort auch "endlose" Maps machen kann.


      Zu Perlin: Ich glaub SDX hat hier mal ein 2D Perlin Script reingestellt, ich denke das kann man gut zu 1D verändern.
      wupto.net/ Nicht meine Seite!
      We love Koalas.

      GM-D-Spam-o-Meter: 32%
    • Da gibt es wirklich zig Möglichkeiten.
      Diese Wurm-Idee von Henrik ist schon ganz nett, hängt aber in ihrer Wirkung stark von der Implementierung ab. Am Ende sehen die Level vielleicht doch aus, als hätte dieselbe Person sie zusammengepinselt.
      Was du vermutlich willst, ist der gute Mittelweg zwischen "gut spielbar" und "immer wieder neu".


      Generell halte ich es für eine gute Idee, sich vorher die Rahmenbedingungen zu überlegen und Regeln zu formulieren, die zugleich als variable Parameter eingestellt werden können.
      Das wären solche Dinge wie "maximale Anzahl an Abgründen" oder "Höhe und Länge der Plattformen" etc. Dann würde ich das ganze in 3 Schritten machen:

      1. Aus diesen Parametern bzw. Regeln lässt du kleinere, in sich mehr oder weniger abgeschlossene Elemente generieren. Je nach Art der Elemente benutzt du andere Parameter oder sogar andere Algorithmen. Diese Elemente unterteilst du dann in Kategorien (Höhle, Unterwasser, Kreuzung) bzw. legst ein paar Eigenschaften fest (Höhe, Breite der Anschlussstücke). Ferner beinhalten die Elemente ein paar reservierte Felder (z.B. für Gegner und Items), über die aber noch nicht entschieden wird.

      2. Diese Elemente werden dann von einem weiteren Algorithmus anhand ihrer Kategorien und Eigenschaften zusammengefügt. Falls notwendig, generiert dieser auch Zwischenstücke (Anpassen von Höhen etc.).
      Er arbeitet entweder mit festen Eingaben (z.B. gibt der User ein, dass er einen Level haben will, der zuerst 7 Höhlenelemente haben will, dann 4 Unterwasserelemente) oder generiert auch diese Vorgaben selbst.

      3. Ein letzter Algorithmus betrachtet den Level als Ganzes und plaziert Tilesets, Gegner, Zwischenspeicher und ähnliches. Dabei macht er sich die reservierten Plätze der einzelnen Elemente zu Nutze und variert damit die bereits zufällig erstellten Einzelbausteine.
      Wäre es z.B. ein Mario-Level, würde er von den potentiellen 100 Fragezeichen-Blöcken 50 auswählen und davon wiederum 8 Stück in regelmäßigen Abständen zueinander mit Pilzen bestücken.


      So würde ich das Problem angehen, denke ich. Das habe ich mir jetzt aber spontan aus dem Hut gezaubert.


      Edit: Diverse Tippfehler und konfuse Sätze ausgebessert.
    • @ Henrik:
      So ein ähnliches System habe ich schon bei meinem Aktuellen Generator implementiert. Wollte es aber doch eine Spur komplexer haben.^^
      Das mit dem Höhlensystem klingt gut, aber die Frage dabei ist ob sie dann auch "natürlich" wirken.


      @ MewX:
      Für etwas was du einfach so "aus dem Hut gezaubert" hast, ist das schon eine sehr guter gedanke.
      Eigentlich wäre dies Sogar eine sehr gute Lösung. Wird auf jedenfall nicht leicht sein so etwas zu scripten. :S

      @Florp:
      Eine Sinusschwingung habe ich auch anfangs in betracht gezogen, jedoch wäre die welt sozusagen nicht "random" generiert sondern immer auf- und Abgehen.
      Natürlich kann man noch einen randomwert auf der y-Achse addieren, jedoch würde man immernoch diese Sinusschwingung erkennen.


      Ich bin generell über jeden Rat dankbar den ihr mir hier geben könnt. Es geht mir dabei um den Strukturaufbau des Generators (so wie MewX es beschreiben hat.)
      und um einen evtl Pseudo-Algorithmen bzw Grundgedanken wie man z.B: generierte Höhlen bzw Seen realistisch aussehen lassen könnte. (Oder wie man gar so etwas "richtig" generiert.)
    • LEWA schrieb:

      Eine Sinusschwingung habe ich auch anfangs in betracht gezogen, jedoch wäre die welt sozusagen nicht "random" generiert sondern immer auf- und Abgehen.
      Natürlich kann man noch einen randomwert auf der y-Achse addieren, jedoch würde man immernoch diese Sinusschwingung erkennen.

      nicht unbedingt

      pseudocode:

      Quellcode

      1. ran = 0;
      2. for (i=0; i <= room_width; i++)
      3. {
      4. ran += random(3)-1.5;
      5. Y = sin(i) + ran;
      6. }


      wenn du die kurve breit machst und nen guten random faktor benützt
    • Hmmm... okeyy... ein Versuch kann ja nicht schaden.^^

      Und hätte jemand evtl. eine Idee wie man halbwegs realistische Höhlengänge erstellen könnte?
      Die Wurm- Idee ist grundsätzlich nicht schlecht, jedoch würde mich interessieren ob es noch andere Möglichkeiten gibt so etwas zu realisieren.
    • Noch ein anderer Ansatz:
      Du solltest dir auch unbedingt mal "Spelunky" ansehen. Dürfte glaub ich der bekanntesten Indie-Platformer mit zufallsgeneriertem Inhalt sein.
      Spelunky ist übrigens auch mitm Game Maker entwickelt und zudem Open Source. :)

      Das System hinter Spelunky funktioniert mittels Leveltemplates, welche über Arrays definiert werden, so z.B.:

      Quellcode

      1. 000000
      2. 000111
      3. 110001
      4. 000011

      1 = Platform
      0 = freier Platz
      Diese Templates welche dann zufällig (bzw. nach bestimmten Regeln) zusammengesetzt um ein Level zu formen. Das gibt dem Entwickler die Freiheit die Templates von Hand mit Liebe zum Detail zu bauen, das große Ganze aber einem Algorithmus zu überlassen. Ich mache das im Moment auch so mit nem Top-Down Spiel, da werden Inseln nach diesem Schema generiert.

      Tilesets und Texturen:
      forums.tigsource.com/index.php?topic=9859.0
      In dem Tigsource Topic wird gut beschrieben wie du zufallsgenerierte Levels sinnvoll mit Tilesets belegen kannst um fließende Übergänge zu haben.
      Hab sowas auch schon gemacht und mitm Game Maker implementiert.

      Noch was generelles was mir zu Platformern einfällt:
      squidi.net/mapmaker/musings/index.php
      Beim Generieren von Levels musst du darauf achten, dass alle Platformen erreichbar sind. Das heißt die Sprunghöhe und Sprungweite des Spielers/Gegners muss beachtet werden.
      Squidi hat auch noch ne Menge Gedanken zu PCG (procedural generated content) verfasst. Das Ganze basiert auf Rätsel-Bäumen, welche ich für die sinnvollste Möglichkeit halte Story und Puzzles per Zufall zu generieren.
    • Ich arbeite derzeit an einem Game, wo ich auch eine Map-Zufallsegeneration eingebaut habe. Und diese funktioniert etwa so:
      Sie ist aus zwei objekten, eines welches in einer schleife am untersten punkt der map läuft und in einer nach einer schleife endet, wenn es den rechten Map Rand verlässt und sich dann zerstört. in dieser schleif hat es einen anfangswert und acht intervallwerte. Als ersten schritt generiert es das zweite objekt n-mal (so viel wie anfangswert) nach oben und geht dann eine Reihe weiter nach rechts. Dann addiert bzw subtrahiert es einen zufälligen wert aus den intervallwerten zum startwert und geht wieder die generationsschleife durch solange bis es zuende geht. dann sind die ganzen anderen objekte drann; diese wählen sich nun aus welche art von Material oder Block sie sind und bestimmen dies mit hilfe der y-Achse und einem geringen random wert spezieller materialien (darunter zb. den Höhlengenerator, der wie gesagt Löcher in die unteren schichten der Map bohrt). wenn dies dann alles vollendet ist. werden alle unbenötigten Instancen deaktiviert und die Runde beginnt...
      ////////////////////////////////////////////////////////////////////////////////////////////////