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?
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.
--
Aktuelles Projekt "Uns're Ordnung ist das Chaos!
Verändern heißt zerstör'n!
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.
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.
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
--
Aktuelles Projekt "Uns're Ordnung ist das Chaos!
Verändern heißt zerstör'n!
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.
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.
Möglich wäre auch:
Diese beiden Zeilen machen jeweils das Gleiche wie deine Methode. Setz also statt dem Methodenaufruf einfach eine der beiden Zeilen ein.
@-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
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.
-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?