Ergebnis 1 bis 6 von 6

Thema: Frage zum Ansatz eines eigenen Intrepreters

  1. #1

    Frage zum Ansatz eines eigenen Intrepreters

    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:
    Code:
    self.set_hp(50)
    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:
    Code:
    # slice_next_word(String WelcherString, String Trennungszeichen)
    # Gibt das nächste Wort aus dem String WelcherString bis zu dem ersten Zeichen Trennungszeichen wieder.
    # Entfernt das wiedergegebene Wort und das Trennungszeichen anschließend vom String
    key_target = self.slice_next_word(action_string, ".")
    key_order = self.slice_next_word(action_string, "(")
    key_parameter = self.slice_next_word(action_string, ")")
    key_target_id = CODE_ID_HASH[key_target]
    key_order_id = CODE_ID_HASH[key_order]
    key = [key_target_id, key_order_id, key_parameter]
    @action_array[@current_action_id] = key
    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:
    Code:
    action_key = @action_array[@current_action_id]
    $map.npc_objects[ key[ 0 ] ].action_functions[ key[ 1 ] ].call( key[ 2 ] )
    Ist dies eine gute Idee oder sollte ich es doch anders angehen?

    Geändert von Cornix (24.08.2011 um 14:20 Uhr)

  2. #2
    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.

  3. #3
    Du meinst ich soll den Code für jedes Event als eine eigene Funktion schreiben und diese dann ausführen lassen?

  4. #4
    sorry cornix, I tried to answer your question about the other code.

    this is off topic but your PM box is full. i can't respond.

    [sorry, sorry, i will delete this post asap]

  5. #5
    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:
    Code:
    module EventCodes
      @codes = 0
      def self.define_event_code code
        @codes += 1
        eval "def self.event_code_#{@codes}(npc); #{code}; end"
        @codes
      end
    
      def self.execute id, npc
        send :"event_code_#{id}", npc
      end
    
    end
    
    # beim Betreten der Map/Laden des NPCs
    mein_npc.event_code_id = EventCodes.define_event_code "irgendein_event_code"
    
    # beim Aktivieren des NPCs
    EventCodes.execute mein_npc.event_code_id, mein_npc

  6. #6
    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.

    Vielen Dank für die Hilfe.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •