Dungeon creator

Top  Previous  Next

Dieser Code erlaubt Ihnen, Level aus Prefabs zusammenzusetzen. Was daran so interessant ist? Nun, lassen Sie mich Ihnen zeigen, wie die Leveldatei aussieht; sie befindet sich in level01.dat, eine Datei, die trotz ihrer Endung eine reguläre Textdatei ist und mit einem einfachen Editor wie Notepad oder Wordpad geöffnet werden kann:

 

aum54_dungeon1

 

Die ersten beiden Zahlen (15 und 13) geben die Größe des Levels in x und y Richtung an; die folgenden Zeilen beschreiben das Level, welches (man glaubt es kaum) zur Laufzeit aus einigen Prefabs und Models zusammengesetzt wird. In meiner Demo steht “p” für den Spieler, # für eine Wand, “ “ (leertastte) für Fußboden, “s” für eine Spinne und “f” für das Ziel. So sieht das “richtige” Level dann aus:

 

aum54_dungeon2

 

Sehen Sie die Ähnlichkeit? Das “richtige” Level wurde zur Laufzeit aus den Informationen in level01.dat generiert. Warum ändern Sie nicht die Datei und sehen wie die Änderungen wirksam werden, sobald das Level neu geladen wird?

 

Ich habe mich für ein Dungeon Spiel entschieden, aber Sie können auch komplexere Bausteine verwenden, um Level für Shooter, Adventure etc. zu generieren. Die Vorteile liegen auf der Hand: Sie brauchen nicht so viel Zeit, die Level zu erstellen und ausrechnen zu lassen und das Spiel wird viel kleiner sein. Bedenken Sie wie groß ein Spiel mit 30 Leveln ist, von denen jedes 10 MB groß ist und vergleichen Sie das mit der Größe der Prefabs und Models + 30 Level-Dateien mit etwa 200 300 Byte jeweils... das ist ein Unterschied!

 

Die Spinnen bleiben stehen bis eine von ihnen den Spieler entdeckt und die anderen alarmiert. Ich werde nicht näher darauf eingehen wie sie (und der Spieler) programmiert sind, weil Sie das schon oft gesehen haben und ich den Code gut kommentiert habe; ich wüde lieber näher darauf eingehen, wie der Dungeon Creator Code funktioniert.

 

Ich habe zwei Prefabs für das Projekt erstellt: eine Wand und einen Fußbodenblock.

 

aum54_dungeon3

 

Diese Prefabs sind einfach 64 x 64 x 64 Quant Würfel, die mit einfachen aneinanderfügbaren Texturen versehen sind. Die Engine liest die Daten aus der Leveldatei und produziert die Blöcke und Entities mit ent_create entsprechend der gefundenen Information.

 

aum54_dungeon1

 

Wir brauchen die Größe des Levels vorab, weil die Engine die Anzahl der Spalten (15 in meinem Beispiel) und Zeilen (13) benötigt. Dann kann das Level selbst in die Datei geschrieben werden; wie Sie sehen besteht die erste Zeile nur aus Wänden; die folgenden Zeilen enthalten Leerzeichen (Fußboden), den Spieler (die Engine wird einen Fußbodenblock kreieren und den Spieler darauf plazieren) und so weiter. Schauen Sie sich den Code an, der das “p”, das Symbol für den Spieler, verarbeitet:

 

if (str_cmp(current_character, "p") == 1) // player? (we create the player and the floor below it)

{

       starting_position.z = 0;

       ent_create(floor_wmb, starting_position, make_static);

       starting_position.z += 64;

       player = ent_create(player_mdl, starting_position, players_action);

}

 

Wenn die Engine das “p” in der level01.dat Datei liest, wird ein Fußbodenblock auf der Höhe z = 0 generiert, diesem wird die make_static Funktion zugewiesen und dann wird der Spieler 64 Quants über dem Fußboden erstellt, welcher dann die “players_action” Funktion zugewiesen bekommt.

 

Sie können weitere Prefabs einbauen und es müssen auch nicht einfache Würfel sein, sondern könnten auch kleine, mittlere oder sogar große Teile eines Levels. Schauen Sie sich die gut kommentierte Funktion read_level_data() an. Und vergessen Sie nicht, die entsprechenden Größen für Ihre eigenen Prefabs in diese Funktion zu schreiben, wenn Sie andere Größen verwenden.

 

Noch eine Sache: Acknex mag es nicht mit zu vielen Entities in einem Level zu arbeiten (keine Engine tut das). Daher habe ich die Levelgröße auf 30 x 30 Blöcke, also 900 Entities begrenzt, aber Sie können diese Werte noch etwas vergrößern. Ich habe eine einfache Funktion für alle Elemente des Levels, die nicht dynamisch sind (sie bewegen sich nicht, haben keine Events, etc.):

 

function make_static()

{

       my.dynamic = off;

}

 

Diese Funktion erhöht die framerate, vor allem bei einem größeren Level mit vielen Blöcken.