Guten Tag.
In meinem derzeitigen Hauptprojekt will ich ein eigenes NPC-System aufbauen und diesen einen eigenen Interpreter schreiben, ähnlichem dem des RPG-Makers.
Ich würde gerne wissen wie ihr diese Überlegungen findet und ob ihr mir einen Verbesserungsvorschlag geben könntet, besonders was die Performance angeht will ich bestmögliche Ergebnisse erzielen.
Dies ist der erste Teil des Interpreters, er wird ausgeführt wenn ich die Karte erstelle, also nicht zur Laufzeit des Spieles!
Im ersten Schritt soll eine Zeile Code analisiert werden, zum Beispiel:
würde eingelesen werden als "self"+Trennungszeichen+"set_hp"+Parameterzeichen+"parameter"+Zeilenendungszeichen.
Dann würden die Schlüsselelemente "self" und "set_hp" in ihre entsprechende ID umgewandelt werden. In einem Hash würde geguckt werden welcher ID jeweils "self" und "set_hp" entsprächen, zum Beispiel 0 und 13.
Anschließend würde ein Array erstellt werden welches die Elemente [0, 13, "parameter"] enthält.
Dieses Array wird für den NPC in seinem <Action_Array> an der entsprechenden Stelle gespeichert werden.
Also ungefähr so:
Nun kommt der zweite Teil des Interpreters, dieser wird ausgeführt sobald der Spieler versucht mit dem NPC zu interagieren.
Das <Action_Array> wird Schritt für Schritt abgegangen und die entsprechenden Array-Objekte werden ausgeführt.
Zuerst das erste Element unseres Arrays [0, 13, "parameter"], um den NPC zu finden mit welchem agiert werden soll wird in der Game_Map Klasse der NPC mit der ID 0 gewählt.
Anschließend wird die Funktion gesucht welche dieser NPC ausführen soll, nämlich die 13 Funktion in einem konstanten Array welches alle Funktionen der NPC-Klasse beinhaltet.
Danach wird dem gewählten NPC befohlen die gewählte Funktion auszuführen und der "parameter" wird der Funktion als Parameter übergeben.
Also ungefähr so:
Ist dies eine gute Idee oder sollte ich es doch anders angehen?
Du kannst auch einfach den Code mit eval ausführen. Wenn du den Overhead von eval vermeiden willst, kannst du den Code auch in Methoden übersetzen. Sprich jedes Event in eine Methode einbetten und per eval ausführen. Dann musst du zum Ausführen des Codes eines Events nur noch eine Methode aufrufen.
Warum nicht? Dürfte die effizienteste Lösung sein. Der Code für die Events muss dabei nicht im Scripteditor stehen, sondern kann auch woanders hin. Du liest den Programmcode zur Laufzeit ein, packst ihn in irgendeine Methode und führst den Code dann per eval aus.
Beispiel:
Es stört mich nicht sonderlich falls es im Scripteditor steht, es war nur eine Frage um sicher zu stellen, dass ich richtig verstanden habe was genau du meintest.
Ich werde mal gucken wie es am Ende aussehen wird, ich habe schon eine Idee denke ich.