Ergebnis 1 bis 5 von 5

Thema: NoMethodError

Hybrid-Darstellung

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

    NoMethodError

    Hey Leute^^

    Ich hab ein kleines Script für eine HP-Leiste geschrieben, aber sobald das Script aufgerufen wird sagt er:
    Code:
    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:
    Code:
    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

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

  3. #3
    Zitat Zitat
    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^^

    Zitat Zitat
    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)

    Zitat Zitat
    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

    Zitat Zitat
    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):
    Code:
        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...

    Geändert von Estelyen (19.03.2009 um 16:08 Uhr)

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

    Code:
    q =- $game_variables[b]
    Das Minus sollte vor dem = stehen.

  5. #5
    Gedankenfehler meinerseits... Hast recht Kelven, daran hats gelegen :P Vielen Dank^^

Berechtigungen

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