PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NoMethodError



Estelyen
19.03.2009, 14:21
Hey Leute^^

Ich hab ein kleines Script für eine HP-Leiste geschrieben, aber sobald das Script aufgerufen wird sagt er:

Line 119: NoMethodError occurred.
Undefined Method 'show' for nil:NilClass
Zwei Dinge die mich daran wundern sind, dass ich genau den selben Befehl schon einige Male vor Zeile 119 im script stehen hab und zweitens dass er diese Fehlermeldung sogar ausgibt wenn er (durch eine if-Bedingung) diese Zeile eigentlich überspringen sollte...

Hier mal das Script mit Zeile 119 unterstrichen:


module Numberpic
def Numberpic.show(x)
if x == 1
a1 = 3
a2 = 4
a3 = 7
b = 22
x1 = 39
x2 = 52
y = 427
end
if x == 2
a1 = 5
a2 = 6
a3 = 7
b = 26
x1 = 73
x2 = 86
y = 427
q = 7
while q <= 18
$game_screen.pictures[q].erase
q += 1
end
end
if x == 3
a1 = 19
a2 = 20
a3 = 23
b = 23
x1 = 39
x2 = 52
y = 445
end
if x == 4
a1 = 21
a2 = 22
a3 = 23
b = 27
x1 = 73
x2 = 86
y = 445
q = 23
while q <= 46
$game_screen.pictures[q].erase
q += 1
end
end
if x == 5
a1 = 47
a2 = 48
a3 = 51
b = 24
x1 = 39
x2 = 52
y = 463
end
if x == 6
a1 = 49
a2 = 50
a3 = 51
b = 28
x1 = 73
x2 = 86
y = 463
q = 51
while q <= 62
$game_screen.pictures[q].erase
q += 1
end
end
c = $game_variables[b]
d = 0
while c >= 10
c -= 10
d += 1
end
$game_screen.pictures[a1].show("Zahl_" + d.to_s, 0, x1, y, 100, 100, 255, 0)
$game_screen.pictures[a2].show("Zahl_" + c.to_s, 0, x2, y, 100, 100, 255, 0)
e = $game_variables[b]
f = 0
g = 0
if x = 2 or 4 or 6
while e >= 1
$game_screen.pictures[a3 + g].show("Point Empty", 0, 104 + f, y + 1, 100, 100, 255, 0)
g += 1
f += 6
e -= 1
end
end
if x = 1 or 3 or 5
q = $game_variables[b + 4]
q =- $game_variables[b]
if e >= 5
while e >= 1
$game_screen.pictures[a3 + g].show("Point Full", 0, 104 + f, y + 1, 100, 100, 255, 0)
g += 1
f += 6
e -= 1
end
end
if e >= 3
while e >= 1
$game_screen.pictures[a3 + g].show("Point Low", 0, 104 + f, y + 1, 100, 100, 255, 0)
g += 1
f += 6
e -= 1
end
end
if e >= 1
while e >= 1
$game_screen.pictures[a3 + g].show("Point Critical", 0, 104 + f, y + 1, 100, 100, 255, 0)
g += 1
f += 6
e -= 1
end
end
while q <= 1
$game_screen.pictures[a3 + g].show("Point Empty", 0, 104 + f, y + 1, 100, 100, 255, 0)
g += 1
f += 6
q -= 1
end
end
end

end


btw, mag sein dass der code stellenweise etwas umständlich is, bin halt noch nicht so sehr geübt mit Ruby :o

-KD-
19.03.2009, 15:13
Im Script sind mehrere Fehler drin. Wenn du abfragen willst, ob eine Variable einen bestimmten Wert hat, dann kannst du nicht x = 3 or 4 or 5 schreiben. Ausgewertet wird das ja folgendermaßen:
((x = 3) or (4)) or 5
---> setze die Variable x auf 3 und werte aus:
(3 or 4) or 5
---> 3 ist ein wahrer Wert, also gibt 3 or 4 als Ergebnis 3 aus
3 or 5
---> 3 ist immer noch ein wahrer Wert, also gibt 3 or 5 als Ergebnis 3 aus
3
---> 3 ist ein wahrer Wert, also wird if-Bedingung ausgeführt

Wenn du abfragen willst, ob eine Variable einen bestimmten Wert hat, verwendest du ==. Und or dient nicht dazu mehrere Abfragewerte zu bestimmen, sondern or ist eine Operation die zwei Wahrheitswerte aufnimmt und einen Wahrheitswert zurückgibt. Richtig wäre also
x == 3 or x == 4 or x == 5
oder kürzer
x.between?(3, 5)

Das Problem mit der Fehlermeldung liegt aber daran, dass du auf ein Picture zugreifst, welches nicht existiert.

Mal 'ne andere Frage: Schreibst du das Script, um ein wenig Ruby zu lernen, oder willst du damit wirklich produktiv arbeiten? Denn so wie das Script geschrieben ist, solltest du lieber EventCommands nutzen. Das geht einfacher.
Wenn du von Ruby profitieren willst, musst du auch die Techniken von Ruby nutzen. Pictures und Prozedurales Programmieren mit unzähligen ifs und whiles ist typisch für Event-Code. Rubycode ist meist einfacher aufgebaut und nutzt statt unzähligen if-Sätzen lieber Polymorphismen, statt unzähligen Schleifen lieber Iteratoren, statt Pictures und Makervariablen lieber Sprites und Instanzvariablen, statt vorgefertigte Bilder zeichnet man in Ruby solche Bilder lieber selbst usw.
Wie gesagt: Wenn du nur ein wenig rumprobieren willst, will ich dich nicht aufhalten. Wenn du aber wirklich Scripte für dein Spiel schreiben willst, nutze entweder wie gewohnt EventCommands, oder beschäftige dich noch etwas tiefgründiger mit Ruby, um dessen Stärken wirklich nutzen zu können.

Estelyen
19.03.2009, 15:55
Richtig wäre also
x == 3 or x == 4 or x == 5
oder kürzer
x.between?(3, 5)
"between" kann ich in diesem Fall nicht nutzen, weil die Zahlen die er abfragen soll ja nicht 3,4,5 sondern 2,4,6 bzw. 1,3,5 sind... mit dem ersten Vorschlag werd ichs jedenfalls nochmal veruchen^^


Das Problem mit der Fehlermeldung liegt aber daran, dass du auf ein Picture zugreifst, welches nicht existiert.
Das Picture existiert volle Kanne^^ Die Zeile 119 hab ich 1:1 von weiter oben kopiert (Zeile 85) und die hat wunderbar funktioniert als ich das script getestet hab (das war bevor ich den Kram um Zeile 119 hinzugefügt hab)


So wie das Script geschrieben ist, solltest du lieber EventCommands nutzen.
Ich nutze in diesem Fall Ruby weil ich die Pic-Nummer mit Eventcommands nicht durch eine Variable bestimmen kann. Das was ich über Ruby schon weiß hab ich aus dem Rubytutorial in deiner Sig gelernt und wenn du das Ding geschrieben hast, dann RESPEKT http://www.multimediaxis.de/images/smilies/old/sm_12.gif


Wie gesagt: Wenn du nur ein wenig rumprobieren willst, will ich dich nicht aufhalten. Wenn du aber wirklich Scripte für dein Spiel schreiben willst, nutze entweder wie gewohnt EventCommands, oder beschäftige dich noch etwas tiefgründiger mit Ruby, um dessen Stärken wirklich nutzen zu können.
Im Grunde ist es nur Rumspielerei was ich mache, ich hab nicht vor mein Projekt auf irgendeine Internetseite zu stellen, dafür ist es nicht... mmh, "spektakulär" genug... Ich würde es höchstens an zwei drei Bekannte schicken die sowieso keinen Blassen von Ruby oder Programmieren an sich haben.


EDIT:
Hab den Code jetzt folgendermaßen verändert (Den Anfang hab ich hier weggelassen):


if x == 2 or x == 4 or x == 6
while e >= 1
$game_screen.pictures[a3 + g].show("Point Empty", 0, 104 + f, y + 1, 100, 100, 255, 0)
g += 1
f += 6
e -= 1
end
else
q = $game_variables[b + 4]
q =- $game_variables[b]
if e >= 5
while e >= 1
$game_screen.pictures[a3 + g].show("Point Full", 0, 104 + f, y + 1, 100, 100, 255, 0)
g += 1
f += 6
e -= 1
end
end
if e >= 3
while e >= 1
$game_screen.pictures[a3 + g].show("Point Low", 0, 104 + f, y + 1, 100, 100, 255, 0)
g += 1
f += 6
e -= 1
end
end
if e >= 1
while e >= 1
$game_screen.pictures[a3 + g].show("Point Critical", 0, 104 + f, y + 1, 100, 100, 255, 0)
g += 1
f += 6
e -= 1
end
end
while q <= 1
$game_screen.pictures[a3 + g].show("Point Empty", 0, 104 + f, y + 1, 100, 100, 255, 0)
g += 1
f += 6
q -= 1
end
end
end

end

Den Fehler gibt er mir aber immer noch...

Kelven
19.03.2009, 17:37
Hm, die unterste Abfrage ist ja eine Endlosschleife. Sie wird nur ausgeführt, wenn q <= 1 ist, aber q wird dann nicht erhöht, sondern weiter verringert, bleibt also immer <= 1. Gleichzeitig erhöhst du g immer weiter. Vermutlich tritt der Fehler dann auf, wenn a3 + g über 100 liegt. Ich nehme mal an du hast nur das Zeichen vertauscht und meinst eigentlich q >= 1.

P.S. Bei dieser Zeile ist übrigens ein Fehler.


q =- $game_variables[b]

Das Minus sollte vor dem = stehen.

Estelyen
19.03.2009, 17:51
:o Gedankenfehler meinerseits... Hast recht Kelven, daran hats gelegen :P Vielen Dank^^