Ergebnis 1 bis 4 von 4

Thema: [Erledigt] XP/RGSS: Nach Soft-Reset ungeplante/findbare Loop

  1. #1

    [Erledigt] XP/RGSS: Nach Soft-Reset ungeplante/findbare Loop

    Namd.

    Nachdem ich jetzt schon eine Weile gesucht hab, muss ich leider euch nach einer Hilfestellung zu meinem Problem fragen:

    Ich habe eine kleine Erweiterung and RPG::Sprite vorgenommen. Im Zuge dessen hab ich natürlich auch initialize erweitert.

    Code:
    class RPG::Sprite
    
        alias old_init initialize
        def initialize(viewport = nil)
          p self #(debug)
          old_init (viewport)
          @_state_duration = 0
          @_state_plus = []
          @_state_minus = []
          @_state_sprites = []
          @_state_icons = []
        end
    ...
    end
    Wenn ich mein Spiel nun starte, und mit F12 zum Titelbildschirm zurückkehre, bekomm ich in der old_init nen SystemStackError. Seit dem die Erweiterung da ist. Ein Sprite_Character wird unendlich oft geladen.
    Sprite_Character ist unverändert
    Game_Title lädt auch nur regulär eine Game_Map
    und Game_Map ist unverändert

    etc.

    irgendwo muss ein Fehler drin sein, sonst hätte ich das Problem ja nicht.

    Dummerweise müsste ich ja praktisch das komplette Projekt schicken, um euch das checken zu lassen - und das sollt ihr auch nicht.

    Meine Frage also: kann ich irgendwie mir ausgeben lassen, WO eine Funktion aufgerufen wurde? Ähnlich wie der Trace einer Fehlermeldung? So dass ich rausfunden kann, an welcher stelle das initialize unendlich aufgerufen wird?

    Geändert von Todu (17.10.2011 um 18:06 Uhr)

  2. #2
    Zitat Zitat
    Meine Frage also: kann ich irgendwie mir ausgeben lassen, WO eine Funktion aufgerufen wurde? Ähnlich wie der Trace einer Fehlermeldung? So dass ich rausfunden kann, an welcher stelle das initialize unendlich aufgerufen wird?
    Das weiß ich leider nicht, aber:

    die endlosschleife wird durch den alias befehl verursacht (bzw eigentlich durch die initialize methode).
    das liegt daran, dass nur der für dich zugeängliche rgss-teil beim soft-reset neu geladen wird.
    die alte RPG::Sprite klasse wird somit nicht neu geladen, weshalb der alias befehl dafür sorgt, dass old_init auf deine initialize methode statt der originalen verweist.
    deshalb sind old_init und initialize nach dem soft-reset dieselbe methode und du landest in einer rekursiven endlos-schleife, sobald du initialize aufrufst (bzw ein objekt erzeugst)

    eine möglichkeit das zu umgehen wäre:

    Code:
    class RPG::Sprite
      if defined?(old_init).nil?#wenn old_init noch nicht definiert wurde
        alias old_init initialize
      end
        def initialize(viewport = nil)
          p self #(debug)
          old_init (viewport)
          @_state_duration = 0
          @_state_plus = []
          @_state_minus = []
          @_state_sprites = []
          @_state_icons = []
        end
    ...
    end

  3. #3
    Beim Soft-Reset werden alle Scripte im Scripteditor neu ausgeführt. Das kann zu vielerlei Fehlern führen (insbesondere beim Einsatz von alias). Du kannst das Neuausführen des Scripteditors verhindern, in dem du am Anfang des Scripteditors abfragst ob die Scripte schon einmal geladen wurden. Falls ja, dann lass das Main-Script ausführen.

    Könnte in etwa so aussehen:
    Code:
    if defined? Main
      Main.run
      exit
    end
    module Main
      def self.run
        # hier den Code zum Starten des Spiels einfügen
      end
    end
    Zitat Zitat
    Meine Frage also: kann ich irgendwie mir ausgeben lassen, WO eine Funktion aufgerufen wurde? Ähnlich wie der Trace einer Fehlermeldung?
    Den aktuellen Stacktrace bekommst du mit der Methode Kernel#caller. Aber das hilft dir wenig. Die Endlosschleife ist ja im initialize selbst (genauer: initialize -> old_init -> initialize -> ...)

    @ShiningAdvances: Müsste method_defined?(:"old_init") statt defined?(old_init) heißen. Sonst prüfst du nur auf Singletonmethoden.

    Geändert von -KD- (14.10.2011 um 19:03 Uhr)

  4. #4
    Danke an euch beide. Dass alles neu eingelesen wird war mir nicht bewusst, das erklärt das Problem definitiv. Ich werd vermutlich allerdings ShiningAdvances Ansatz nehmen - KDs Ansatz heb ich mir potentiell auf, (ich prober die Tage ein wenig damit herum vermutlich), aber meine Konzentration reicht grad nicht, um mir bewusst zu machen, welche Auswirkungen das hat, ausser eben diese aliases zum umgehen - und ob ich da mehr ausser der normalen main-loop einfügen muss. Normal wär ich dazu denk ich in der Lage, aber Konzentration ist grad ein wenig low. Wenn ich Zeit hab da drüber nachzudenken kann es passieren, dass mir das dann doch besser gefällt.

    Danke für Kernel#caller. Kann immernoch nützlich sein an nem anderen Punkt bzw aufjedenfall für verbessertes Ruby-Verständnis. Leider noch nicht viel davon ausserhalb der RGSS machen können.

    -----Update

    Hab KDs Vorschlag umgesetzt, nachdem ich die Simpelheit gesehen hab. Hilft gegen alle weiteren Probleme dieser Art. Hab auch nun mal Entdeckt, dass ich wider Erwarten in KDs Tutorial noch was lernen kann - v.a. über Iteratoren & Blöcke. Aufgrund dessen hätt ich mir einiges einfacher machen können - und werd es in Zukunft auch.

    Geändert von Todu (17.10.2011 um 18:05 Uhr)

Berechtigungen

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