Ergebnis 1 bis 20 von 29

Thema: Skriptproblem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Skriptproblem

    Dies ist ein Appell an die Skriptmeister der Community!
    Ich verwende eine große Zahl an Skripts in einem Projekt. Diese wurden 1:1 aus einer Demo kopiert. Allerdings trifft dieser Fehler auf:
    Situation: Ein Kampf beginnt. Man agiert, doch wenn der Gegner an die Reihe kommt, tritt ein RGSS-Fehler auf: [Game Battler (nicht die normalen 3 Skripte, sonder ein spezielles anderes - sollte aber als unwichtig für den Fehler gelten, da es in der Demo ja funktioniert)] NoMethodError - undefinied method `find_skill_index' for #<Game_Enemy:0x136e678>. Tja, eben ein NoMethod Fehler, den ich nicht verstehen kann. Ich weiß jetzt nicht in wie fern das mit den anderen Skripts zusammenhängen kann. Ich bitte um eine Erklärung des NoMethodError. Wie könnte ich eine passende Methode definieren und wo?

    Geändert von Expresseon (01.09.2007 um 13:38 Uhr)

  2. #2
    Kann mir niemand helfen? o.O (was ne Frage)
    Es ist ziemlich wichtig, da ich sonst eigentlich das ganze Projekt aufgeben kann. Bitte um Hilfe.

  3. #3
    Definition einer "Method" (Methode):

    Eine "Method" englisch für Methode bzw. allgemein beim Programmieren auch als Funktion oder Function (englisch) bekannt bezeichnet die Zusammenführung meherer Befehle zu einem Befehl (einer sogenannten Funktion). Die Funktion liefert in den meisten Fällen dann einen Rückgabewert mit dem weiter gearbeitet werden kann. Funktionen oder eben Methoden werden meistens dann eingesetzt wenn bestimmte Programmteile mehrfach genutzt werden oder es mithilfe von Funktionen kompakter und einfacher verständlich wird.

    Definition des NoMethod Fehlers:

    Mit dem Wissen was eine Methode ist, und das sie erst irgendwo festgelegt werden muss damit man sie verwenden kann, sowie ein bischen Englisch erklärt sich der Fehler von selber:

    NoMethodError - undefinied method `find_skill_ index' for #<Game_Enemy:0x136e678>

    "undefinied method" bedeutet in dem Sinne soviel wie: es wird eine Methode/Funktion aufgerufen die nirgends deklariert (festgelegt) wurde und Ruby von daher unbekannt ist. Des weiteren kann man der Fehlermeldung entnehmen das es sich um die Funktion "find_skill_index" handelt.

    Lösung? recht einfach: durchsuch mal die Scripte in der Demo und in deinem Projekt nach der Funktionsdeklaration. Oder schau ob du nicht irgendeinen Teil vergessen hast zu kopieren.

    Mit deinen sonstigen Scripten die du zu dem Kampfscript zusätzlich eingebaut hast wird das denke ich wenig zu tun haben da ich nicht glaube das eines dieser Scripte die Funktion wiede entfernt.

  4. #4
    Danke für die ausführliche Hilfe.
    Tja die Methode ist in einem Skript, nach dem Fehlerskript definiert:

    #--------------------------------------------------------------------------
    # * Find Skill Index
    #--------------------------------------------------------------------------
    def find_skill_index(skill)
    for i in 0..@skills.size
    if @skills[i] == skill.id
    return i
    end
    end
    return 0
    end

    Als Hinweis: Der Gegner kann mehrere Skills, man selber keine. Könnte es daran liegen? Denn die Methode wird ja definiert, alles ist genauso wie in der Demo, deshalb denke ich mir, dass es am Spiel selbst liegen könnte.

  5. #5
    Wenn du den Text der Fehlermeldung 1:1 kopiert hast, dann befindet sich hinter dem zweiten Unterstrich ein Leerzeichen (wodurch der Methodenaufruf natürlich eine nicht vorhandene Methode aufruft). Nachdem du den Fehler im Script verbessert hast, sollte alles funktionieren.

  6. #6
    Zitat Zitat von P-Games Beitrag anzeigen
    Danke für die ausführliche Hilfe.
    Tja die Methode ist in einem Skript, nach dem Fehlerskript definiert:
    Das könnte der Fehler sein. Soweit ich weiss werden die Scripte von oben nach unten ausgeführt, d.h. das Script welches ganz oben steht wird zuerst ausgeführt und das Main-Script welches ganz unten steht als letztes.

    Es könnte also daran liegen das die Definition der Funktion erst nach dem ersten Aufruf erfolgt und Ruby diese deswegen als unbekannt definiert. Du könntest mal versuchen das Script mit der Funktionsdefinition VOR das Script welches dieFunktion aufruft (und ja den Fehler verursacht) zu verschieben

  7. #7
    @ Kelven:
    Das Leerzeichen ist mein Fehler beim Posten gewesen.

    @ Caine Luveno:
    Ich glaube, das Spielt keine Rolle, mit der Reihenfolge. Ich habe es geändert, aber nichts hat sich gebessert.

    Dieser Fehler scheint mir langsam richtig unheimlich...

  8. #8
    Dann poste doch mal den Teil vom Code, in dem find_skill_index benutzt wird.

  9. #9
    Code:
      def skill_effect(user, skill)
        skill_index = user.find_skill_index(skill)
        # Clear critical flag
        self.critical = false
        # If skill scope is for ally with 1 or more HP, and your own HP = 0,
        # or skill scope is for ally with 0, and your own HP = 1 or more
        if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
           ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
          # End Method
          return false 
        end
    Ich kann auch noch mehr posten. Aber eigentlich müssten die ersten beiden Zeilen alles sagen, denn der Fehler betrifft laut RGSS die 2., hier gepostete Zeile.

  10. #10
    Und find_skill_index ist von welcher Klasse eine Funktion? Bzw. welcher Klasse gehört user an?

  11. #11
    Die Methode müsste laut Fehlermeldung in Game_Enemy oder Game_Battler definiert sein. Davon mal abgesehn ergibt die Methode aber keinen Sinn. Es gibt wesentlich elegantere Lösungen als diese hässlichen For-Schleifen-Konstruktionen.

    Code:
    skill_index = user.skills.find {|skill_id| skill_id == skill} or 0
    Möglich wäre auch:
    Code:
    skill_index = if user.skills.include?(skill) then skill else 0 end
    Diese beiden Zeilen machen jeweils das Gleiche wie deine Methode. Setz also statt dem Methodenaufruf einfach eine der beiden Zeilen ein.

    Geändert von -KD- (01.09.2007 um 16:16 Uhr)

  12. #12
    @-KD-
    Also die letzte Zuweisung dürfte aber falsch sein, wenn ich mich nicht irre. skill_index ist anscheined eine Integer-Variable, skill ist aber so wie es bei P-Games' Zitat aussieht ein Objekt. Soweit ich das richtig sehe, wird bei P-Games' Beispiel das Array der Skills durchlaufen und geschaut, ob ein Skill die gleiche ID hat, wie der mit dem die Funktion aufgerufen wird. Dann wird i zurückgegeben und damit die Position vom Skill innerhalb des Arrays.

    Edit:
    Bei der ersten Zuweisung bin ich mir auch nicht sicher. find wird nach der Hilfedatei vom XP so definiert:

    Zitat Zitat
    Returns the first item that tested as true during the block evaluation. If no item was true, returns nil.
    Bei deinem Beispiel würde dann ein skill-Objekt zurückgegeben werden und nicht dessen ID. Und funktioniert das mit "or 0" wirklich? Bei mir wird das im XP ignoriert und die Variable auf nil gesetzt, falls kein Objekt gefunden wurde.

    Geändert von Kelven (01.09.2007 um 16:57 Uhr)

  13. #13
    -KD-, die beiden Beispiele haben nicht funktioniert. Ich habe das erste ausprobiert, dieses mal war die Methode "skills" undefiniert (laut RGSS).
    Beim zweiten Beispiel wird das Spiel sofort zu Kampfbeginn geschlossen. Könntet ihr nochmal genau beschreiben, was definiert werden muss?

Berechtigungen

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