Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

AintLarry

Frischling

  • »AintLarry« ist der Autor dieses Themas

Beiträge: 58

Wohnort: Hamburg

Beruf: Kaufmann für Versicherungen und Finanzen

  • Private Nachricht senden

11

27.08.2016, 18:58

Hallo,

heute möchte ich euch wieder über den aktuellen Stand informieren.

Der Fehler ist gefunden. Ich meiner Kollisionsabfrage hatte ich einen Denkfehler, dieser ist nun gefixt. Das Ergebnis sieht nun wie folgt aus.



Das ist zwar viel besser als vorher, aber noch lange nicht perfekt. Nun kann ich allerdings durch ändern der Parameter hoffentlich einiges erreichen.

Henrik

AintLarry

Frischling

  • »AintLarry« ist der Autor dieses Themas

Beiträge: 58

Wohnort: Hamburg

Beruf: Kaufmann für Versicherungen und Finanzen

  • Private Nachricht senden

12

29.08.2016, 11:40

Hallo Leute,

nach einem ereignisreichen gestrigen Tag, möchte ich euch auch heute weiter auf dem Laufenden halten.

Die Optimierung der Generierung durch reisen ändern meiner Parameter war leider nicht möglich. Die Generierung von größeren Karten hat sehr viel Zeit in Anspruch genommen. Um diesem Performance-Problem schon jetzt entgegenzuwirken habe ich einen Grundlegenden Teil der Generierung geändert.

Die Anzahl der Räume richtet sich nun nicht mehr nach den verfügbaren Koordinaten, sondern wird vorab per Zufallsvariable festgelegt. Hierdurch spare ich eine Menge Rechenleistung. Dies hat ebenfalls den positiven Nebeneffekt, dass ich das Seitenverhältnis nun einfacher beeinflussen kann.



Außerdem habe ich nun das Setzen der Start- und Endpunkte implementiert und die Kollisionsabfrage der Räume dahingehend verändert, dass vereinzelt Räumen vorkommen können, welche zwar getrennt sind aber direkt aneinander liegen.

Der nächste Schritt ist nun, diese direkten Räume durch entfernen von 1 bis 2 "Wandsteinen" zu verbinden. Danach würde ich gerne beginnen, die Gänge zu generieren.

Der erste Schritt sollte schnell gemacht sein. Für die Gang-Generierung plane ich allerdings etwas mehr Zeit ein.

Henrik

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

29.08.2016, 20:07

Hmm, irgendwie verstehe ich gar nicht so richtig das Problem, das du zu lösen versuchst. Ich denke, dass es den anderen Leuten hier im Forum ähnlich geht ;) Ich sehe diese Bilder, aber sie sagen mir nichts. Ich erkenne nicht, was daran gut oder schlecht ist.

Goldwing Studios

Treue Seele

Beiträge: 359

Wohnort: Heidelberg

Beruf: Softwareentwickler, Vertriebler

  • Private Nachricht senden

14

30.08.2016, 07:09

ich glaube das hier ist sein Entwickler-Tagebuch mit welchem er uns seinen neuen Stand mitteilen möchte.

Ich für meinen Teil finde das immer sehr interessant, den Weg zu was ganzem zu sehen, inspiriert mich immer ;)

Vor allem weil ich sowas selbst mal in ansätzen vorhatte. @TE kannst du uns deine Vorgehensweise eventuell etwas genauer erklären? Oder ist das ein Top-Secret-Projekt?

AintLarry

Frischling

  • »AintLarry« ist der Autor dieses Themas

Beiträge: 58

Wohnort: Hamburg

Beruf: Kaufmann für Versicherungen und Finanzen

  • Private Nachricht senden

15

30.08.2016, 09:23

Hallo David, hallo "GoldwingStudios", hallo an alle anderen.

@David:

Wie in meinem Ausgangspost bereits beschrieben, handelt es sich bei den aktuell gezeigten Bildern lediglich um Testausgaben. Diese erstelle ich rein zurm Kontrolle und Verbesserung der Kartengenerierung. Die Ausgabe welche ich mir gestellt habe sollte klar sein, ein konkretes Problem zum lösen ist aktuell nicht vorhanden. Vielmehr stoße ich jeden Tag auf neue kleine Probleme welche ich versuche mit meinem Wissen zu lösen. Ist dies nicht möglich, versuche ich mir dieses Wissen anzueignen. In diesem Fall geht es auch weniger um programmiertechnisches Können, sondern eher um mein Mathematik-Verständnis.

Die konkrete Aufgabenstellung ist: eine möglichst zufällige (Höhlen-)Karte zu generieren, welche folgenden Ansprüchen genügt:
  • Räume müssen in verschiedenen Größen zufällig auf der Karte verteilt werden
  • Räume werden durch Gänge verbunden
  • Die Räume und Gänge müssen durch Wände voneinander getrennt sein
  • Jede Ebene enthält sowohl einen Start- als auch Endpunkt
  • In den Räumen werden zufällige Dinge verteilt (Kisten, Pfützen, etc.)

Zu einer Erläuterung der Testausgaben komme ich weiter unten noch einmal.

@GoldwingStudios

Damit liegst du recht. Im Prinzip handelt es sich bei diesem Thread um ein Entwicklertagebuch, welches ich aus zweierlei Gründen betreiben möchte.
A) Information, "Werbung", Feedback und B) Ideenfindung, Weiterentwicklung meines Konzeptes, etc.

Es freut mich, dass deinerseits Interesse besteht. Gerne möchte ich diesen Thread noch interessanter und informativer gestalten, doch dafür benötige ich konstruktives und stätiges Feedback. Hierzu werde ich auf versuchen eine Umfrage in diesen Thread einzubinden, wie oft Updates gewünscht sind.

Das Projekt ist keinesfalls Top-Secret. Es handelt sich um ein Hobby-Projekt, welches ich nutze um zu lernen und mich diversen Problematiken auseinanderzusetzen. Gerne helfe ich dabei natürlich, sofern mir möglich, auch anderen.

Wie stellst du dir eine genauere Beschreibung meiner Vorgehensweise vor? Wie Umfangreich sollte diese Ausarbeitung sein? Natürlich könnte ich Schritt für Schritt erklären, warum ich welche Art von Schleife in welcher Weise durchlaufe und welche Variablen ich dabei auf welche Zustände prüfe oder ändere. Die Frage ist nur, ob sich das jemand durchlesen würde. Wenn ja, kann ich das gerne einmal machen.

"Statusbericht" 30.08.2016

Die Verbindung zweier direkt aneinander liegender Räume habe ich gestern implementiert. Ebenso die Generierung von Pfützen, sowie Belegung der Felder für "Loot"-Kisten.



Hier zu sehen ist die Testausgabe von einer Höhe mit vier Ebenen.

Bei den weißen Feldern handelt es sich um noch nicht belegten bzw. generierten Platz. Die schwarzen Felder sind schlichte Wände.
In grün werden die Räume ausgegeben, in gelb die Verbindungsstücke.
Bei den roten und magenta-farbenen Punkten handelt es sich um den Start- und Endpunkt, bzw. Einstieg und Ausstieg aus der Ebene. Die hellblauen Flächen sind Pfützen welche sich in den Räumen befinden. Zu guter Letzt habe ich erneut die Farbe weiß gewählt um potenzielle Standorte für Kisten oder andere Items zu kennzeichnen.

Das ganze passiert im Hinergrund natürlich in Arrays mit IDs. Die farbliche Darstellung dient lediglich der Verdeutlichung und wird später durch Texturen ausgetauscht.

Ich hoffe, ich konnte nun erst einmal alle offenen Fragen klären. Bei weiteren Fragen, Kritik oder Anregungen gilt: immer her damit.

Mit lieben Grüßen

Henrik

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

16

30.08.2016, 10:20

Nun ist es schon deutlicher geworden!

Stehen die Ebenen in irgendeiner Beziehung zueinander?

Ein einfacher Ansatz für die Verbindungsgänge wäre, von zufälligen Randpunkten zufälliger Räume in eine zufällige Richtung (links, rechts, oben, unten) einen Gang zu erzeugen, bis er auf einen anderen Raum trifft. Wenn das nicht passiert, wird der Gang verworfen. Gänge könnten auch mit einer gewissen Wahrscheinlichkeit ihre Richtung ändern, so dass man verwinkelte Gänge bekommen kann.

Am Ende solltest du prüfen, ob alle Räume erreichbar sind, mit einer Art "Flood Fill"-Algorithmus.

Weiterhin solltest du vielleicht zunächst nur den Startpunkt definieren und davon ausgehend den Endpunkt möglichst weit von ihm entfernt platzieren. Es wäre ja sicherlich nicht gut, wenn Start- und Endpunkt direkt nebeneinander liegen und man den Großteil der Räume gar nicht betreten muss. Um einen möglichst weit entfernten Punkt zu wählen, kannst du ebenfalls auf den "Flood Fill"-Algorithmus zurückgreifen.

AintLarry

Frischling

  • »AintLarry« ist der Autor dieses Themas

Beiträge: 58

Wohnort: Hamburg

Beruf: Kaufmann für Versicherungen und Finanzen

  • Private Nachricht senden

17

30.08.2016, 10:32

Hallo David,

freut mich, dass ich das Anliegen nun verdeutlichen konnte.

Die ebenen stehen in keiner Relation zueinander. Zwar sind alle Ebenen gleichgroß, allerdings muss der Endpunkt der einen Ebene nicht genau "unter" dem Startpunkt der nächsten Ebene befinden. Sprich es ist egal, wenn diese Punkte sich an unterschiedlichen Stellen befinden.

Darüber den Algorithmus so zu verändern, dass die Punkte möglichst weit auseinander sind, habe ich auch schon nachgedacht. Ob eine Umsetzung so erfolgen wird, wird sich noch Zeigen. Das Spielprinzip erfordert es nicht zwingend, da dieses nicht primär auf Zeit beruht. Der Spieler könnte dann zwar eventuell eine komplette Ebene überspringen, weil sich Start- und Endpunkt ich selben Raum befinden, allerdings würde er dann in besagter Ebene auch keinerlei Punkte und Items sammeln können. Dies würde ihn A) langfristig nicht weiterbirngen, da im "Geld" und Erfahrungpunkte fehlt und B) kurzfrsitig eventuell einen Weg in einem der folgenden Layer versperren (z.B. wegen einem nicht gefundenen Schlüssel). Hier sehe ich also aktuell keinen Handlungsbedarf. Da der Code so aufgebaut ist, dass die einzelnen Stufen der Generierung relativ unabhängig voneinander abgearbeitet werden, ist eine Änderung auch jederzeit möglich.

An eine ähnliche Vorgehensweise hatte ich auch gedacht. Ich sehe ich aktuell keine zufriedenstellende Alternative. Außerdem sollten bei dieser Variante keinerlei Performance-Probleme auftauchen.

Goldwing Studios

Treue Seele

Beiträge: 359

Wohnort: Heidelberg

Beruf: Softwareentwickler, Vertriebler

  • Private Nachricht senden

18

30.08.2016, 13:57

eventuell kannst du dem Problem mit den Gängen auch durch zufällig platzierte Teleporter entgegnen, so würdest du dir auch Rechenzeit sparen und einfach in jeden Raum einen Teleporter platzieren.

Damit einhergehend würde ich auch für manche Teleporter einen zufälligen Zielpunkt festlegen, um das dynamische Prinzip beizubehalten. Hierbei ist auch gegeben, dass jedes Spielerlebnis ein anderes ist. (Erhöht den Wiederspielwert)

und bezüglich der Updates, wäre cool wenn du ein paar signifikante Code-Stücke(Kot) (sofern du diese Teilen möchtest) erläuterst und vorstellst, damit man sich darüber mal ein Bild machen kann. Gerne kannst du aber auch nur deine jeweilige Vorgehensweise erläutern, damit man da ein wenig mitkommt. Eventuell auch Gedankengänge und/oder Ideen.

Primitive Code-Teile brauchst du hier eigentlich nicht angehen, da man eigentlich schonmal was von einer Schleife und/oder einer Abfrage gehört hat.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

19

30.08.2016, 14:01

eventuell kannst du dem Problem mit den Gängen auch durch zufällig platzierte Teleporter entgegnen, so würdest du dir auch Rechenzeit sparen und einfach in jeden Raum einen Teleporter platzieren.

"Rechenzeit sparen"? Wenn man so eine Level-Generierung ordentlich umsetzt, dauert sie höchstens ein paar hundert Millisekunden. Performance-Optimierungen sollten immer erst am Ende erfolgen, und schon gar nicht sollte man voreilig Abstriche deswegen machen.

AintLarry

Frischling

  • »AintLarry« ist der Autor dieses Themas

Beiträge: 58

Wohnort: Hamburg

Beruf: Kaufmann für Versicherungen und Finanzen

  • Private Nachricht senden

20

30.08.2016, 14:22

Danke Goldwing-Studios und David für eure Posts.

Ich bin da auch eher auf der Seite von David. Dies hat drei Gründe:

1) ist eine Verbesserung der Performance aktuell nicht akut nötig
2) passen Portale meiner Meinung nach nicht in eine Höhlenwelt
3) sehe ich eine persönliche Herausforderung darin, die Generierung der Gänge umzusetzen.

Die genaue Zeit welche die Levelgenerierung aktuell benötigt habe ich noch nicht ausgewertet, da es mir nicht nötig erschien.
Initialisieren des Frameworks, erstellen der Objekte, inkl. Generierung der Karten und Ausgabe der Testbilder, sowie erstellen des Windows und rendern eines Platzhalters dauert aktuell keine gesamte Sekunde.

Ich werde mir heute Abend mal die Zeit nehmen einige signifikante Codeschnipsel vorzustellen und zu erläutern.
Hierunter wird sich der Kollisionsabfrage für die Räume befinden.

Henrik

Werbeanzeige