Generierte Welt

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

  • Generierte Welt

    Hey,

    die mein erstes Thema bereits gelesen haben wissen ja schon was für eine Art Spiel ich erstellen will, für die anderen: Ihr könnt ja mein Thema nocheinmal durchlesen damit ihr etwas mehr davon wisst.
    ​(grundlegend: es geht um ein Side Scroller (Kein Jump and Run) eher ähnlich Terraria)

    jetzt zu meiner Frage undzwar wollte ich fragen wie ein Code aussehen muss damit ich eine sich selbst generierende Welt habe ?

    Bis jetzt habe ich einmal 3 "Blöcke" (Texturen und damit belegte Objekte) erstellt aus die meine Spielwelt selbst generiert werde soll. Ich hab den Spieler bereits animiert und programmiert das er laufen, springen usw kann aber jetzt möchte ich das beim Spielstart sich die Welt auf eine vorgegebene größe aus den drei Blöcken selbst erstellt.
    --> Dabei ist wichtig das ich sagen kann aus welchen Blöcken (Kommen später mehr dazu)
    --> Das ich die Weltgröße selbständig festlegen kann
    --> Das sich jeder Block an seine "ungefähre" possition generiert
    (z.b. Steinblöcke sollen alle unter Erdblöcken generiert werden, Erdblöcke alle über Steinblöcke aber unter Grassblöcken, Grassblöcke über die Erdblöcke jedoch sollen sie Platz nach oben lassen für den Spieler usw)
    --> Das die Blöcke sich nicht in einer graden Linie bilden
    (z.b. das sich auch "Berge" oder "Hügel" ergeben und nicht alles nur gerade und ebenerdig ist)

    Ich hoffe ihr versteht was ich meine

    Zipfelbruder

    P.S. Als kleiner Nachtrag:
    falls jemand zusätzlich weis wie ich einstellen/programmieren kann das wenn der Spieler rechts oder links die Welt verlässt er auf der anderen Seite wieder rauskommt (praktisch die Spielwelt als Planet(ohne Ende)) könnt ihr mir auch gern dabei helfen, wenn der Spieler nach oben bzw. Unten die Spielweltgrenze erreicht soll er nicht weiter kommen.
    (bsp. rechts kann man SPielwelt verlassen und kommt links raus (und genau anders rum auch) aber wenn man versucht Oben oder Unten die Spielwelt zu verlassen geht's nicht weiter)

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

  • Uff, ja da gibts ganz viele Ansätze, vorallem kommts da auf deine Erfahrung an. Da deine Welt aus Blöcken aufgebaut ist, kann man wohl alles auf ein ds_grid runterbrechen. Das ist ein 2D Array, dort sind dann nur die zahlen gespeichert die als id für die blöcke agieren.
    zB:

    Quellcode

    1. -1 = luft;
    2. 0 = stein;
    3. 1 = erde;
    4. 2 = gras;

    Deswegen, weil du ein Performance Problem bekommen wirst, wenn für jeden Block ein Object benutzt wird. Selbst wenn du nur die Objects aktiviert die man sieht, kann das schnell böse enden. Das um und auf ist es das zu managen.
    Dein ds_grid oder wasl sind es 3 grids, weil du 3 ebenen haben willst, werden also auf eine beliebige Art mit den Block Ids gefüllt. Mit den random funktionen, einer perlin-noise extension(falls es die gibt oÄ) Du musst dir einen Algorithmus überlegen, der etwas interessantes hervorbringt, weil mit der reinen randomness der random_ funktionen kommt die auf dauer nicht unbedingt was schönes raus.
    Du berechnest dir jedenfalls eine Art Linie die die Oberfläche vorgibt. Zur vereinfachung einfach mal nur eine Bildschirm Länge.
    Je nach Weltgröße kann dein ds_grid schnell sehr groß werden weil es mindestens room_width/32, room_height/32 pixel groß sein muss wenn deine Blöcke 32x32 pixel groß sind.
    Mit random_set_seed kannst du einen seed festlegen, damit die random funktionen dir immer das selbe ergebnis bieten. Wenn dieser seed, an der x koordinate deiner view berechnet wird, dann kannst du nach rechts scrollen und die funktionen füllen dir dein ds_grid immer gleich. Somit muss dein grid, nie größer als dein room/deine view sein. Es werden einfach die Werte links rausgeknocked und rechts reingeschoben. Und wenn die in die andere Richung gehst, kommen sie wieder rein weil du ja den seed hast der dir immer dasselbe ergebnis gibt. Ich weiß nicht wie ich es verständlicher erklären soll.
    Für die Monstergenerierung etc kann es aber von Vorteil sein mehr als nur die View von der Welt anzuzeigen. Aber denk an Minecraft, dort gibt es auch ein Chunk-system,dass das managed, weil er dir nie die ganze Welt iwo abspeichert, sondern nur den seed und wo du bist und dir die entsprechende landschaft liefert.

    Puh, ok, also du hast jedenfalls dann ein grid, dass dir für die Kollisionen nützlich sein kann, denn du hast ja keine Objecte, aber durch den Wert der im grid an stelle (x div 32, y div 32) eingetrragen ist kannst du nachsehen ob da ein Block ist oder luft. Die einzigen Objecte werden wohl Gegner, Geschosse, der Spieler sein.

    Ich empfehle dir mit einem kleinen grid anzufangen und einem spieler object das dort herumhupfen kann und du die Koordinaten des Spielers immer auf die größe des grids runterbrichst.

    Die Weltgröße ist dann entweder eine maximale größe des grids oder ein maximaler wert, wie oft eine neue spalte ins grid geschoben werden kann. Rechts kommt was ran, links kommt was weg. Die grid größe bleibt gleich, aber du hast dich einen block nach rechts bewegt. Wenn die maximale größer errreicht worden ist, fängt der seed wieder mit dem ursprungswert an und so schiebt sich der anfang der welt wieder rein. So kannst du ewig lang nach rehts laufen und kommst wieder an den anfang.
    Alternativ kommst du einfach nach rechts wenn du einfach die koordinate wenn x > limit ist auf 0 stellst.

    Wenn du einen block abbaust, dann kannst du den block droppen der dem wert im grid entspricht (mit einem switch statement) und dann eine -1 eintragen oder von 2 zu 1 wechseln wenn gras zu dirt wird und dann erst abgebaut wird, etc.

    Das ist aber nur ein Ansatz, der Ansatz zwar den ich verfolgen würde, aber sicher schwer ist, wenn du neu im programmieren bist, aber du hast ja gesagt, dass du schon erfahrung in anderen Engines hast. Ist also wasl eher eine Frage des warm werdens mit dem GM und dessen begriffen.
    Ich kann gerne näher auf diese Koordinaten zu gridkoordinaten konversation eingehen, aber es ist sehr schwer hier mit direkten code beispielen zu helfen. Weil das scchon ein ordentlicher Brocken ist, den du dir da ausgesucht hast^^

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)