Ergebnis 1 bis 13 von 13

Thema: [RMXP] - Rangeabfrage mit Conditional Branches?

  1. #1

    [RMXP] - Rangeabfrage mit Conditional Branches?

    Folgendes Problem: Ich möchte einen Conditional Branch machen der eine Variable abfragt. Es soll aber nicht reagieren wenn der Wert kleiner, größer oder gleich ist, sondern in einem Bereich von 2 bis 8 (einige werden jetzt vielleicht schon wissen wofür ich's brauche). Dummerweise gibt es dafür keine Option.

    Kein Problem, dachte ich, es gibt ja die Möglichkeit Ruby-Code als Condition zu nehmen und im Ruby kann man Bereiche mit ".." angeben.

    Meine Zeile sah also so aus:

    Code:
    $game_variables[8] == 2..8
    Das Ergebnis sah allerdings so aus:

    ArgumentError occurred while running Script - Bad Value for Range

    Was soll das? Der Code müsste exakt so richtig sein. Wenn ich einzelne Zahlen abfrage funktioniert es, Tippfehler sind also auch nicht Schuld.

    Kennt sich da jemand aus, oder weiß wie ichs anders hinbekomme ohne jede Zahl einzeln abzufragen?

    Bitte helft mir...

  2. #2
    Eine erste, ganz dumme Frage: Muss es denn genau eine Conditional Branch sein? Du könntest ja auch zwei hintereinander machen, in Pseudocode ...

    Code:
    If variable => 2
      If variable <= 8
        code der dann ausgeführt wird
      end
    end
    Edit: Dein Code müßte aber seltsamerweise auch funktionieren. Hab's mal getestet o.O

  3. #3
    Hast du irgendwie einen anderen Maker als 1.02a? Ich hab's mehrfach ausprobiert und nix hat gefunzt. Hast du's vielleicht anders geschrieben als ich?

    Ich würde das ganze der Übversicht halber gern so Platzsparend wie möglich umsetzen. Da ich Ruby einfach nicht gut genug verstanden habe muss ich mir jetzt ein (ziemlich komplexes) Menü per Klickskript zusammenschrauben. Das ganze füllt jetzt schon etliche Seiten und ich stehe immernoch ziemlich am Anfang. CBs nehem recht viel Platz weg und machen das ganze nur noch undurchsichtiger. Jaja, ich bin 'n Weichei, ich weiß...

  4. #4
    Ich hab auch den 1.02a.

    Der Code sah bei mir so aus ...

    Code:
    class Testklasse1
      def initialize
         if $game_variables[1] == 1..8 then
           p "Bla"
         else
           p "Blub"
         end
      end
    end

  5. #5
    Das ist jetzt eine Ruby-Klasse! Da funktioniert es bei mir ja auch (glaub ich), aber wie gesagt, ich will das per Conditional Branch abfragen, weil das ganze über Common Events, also Klickskripte läuft.

  6. #6
    Stimmt, bei mir klappt es im Conditional Branch auch nicht. Vermutlich liegt das irgendwo an dem Teil des Codes, der die Bedingung prüft. Range ist ja afaik selber ein Objekt und vielleicht kommt der Maker da beim Vergleich irgendwie durcheinander.

  7. #7
    ich würde in diesem Fall zwar einfach Events benutzen, aber wenn es umbedingt Skript sein muss:
    Code:
    $game_variables[1].between?(1,8)
    Ist eine simple Lösung, die nicht mal Range Objekte benutzt ^^"

    Und noch etwas dazu: Range#== wird nicht funktionieren, da der "==" Operator der Range Klasse nur Objekt Gleichheit untersucht. Was du benutzen musst ist entweder Range#include? oder Range#===
    Code:
    (1..8).include?($game_variables[1])
    (1..8) === $game_variables[1]
    Nebenbei würde "$game_variables[1] === (1..8)" nicht funktionieren! Dabei würde die Methode Fixnum#=== aufgerufen, die mit Ranges schon mal garnichts anfangen kann, also wenn es wirklich Ranges sein müssen benutz auf jeden Fall die include? Methode benutzen, da kommen nicht so schnell Missverständnisse auf.

  8. #8
    Ich kenn jetz Ruby nech aber kann man da in ein if nicht einfach eine Funktion setzen mit 3 Variablen als Eingabe (Intervallanfang und -ende, Variablenzeiger) die mit IA <= VZ <= IE sowas wie return 1 macht?

    also sowas wie: (Achtung, ich benutze einfach mal ne fiktive einfache Syntax, für Zeiger nehm ich einfach mal an, es gäbe eine Funktion p die mit ihrer Eingabe ne bestimmte Variable benutzt)

    function blafunction (a,b,c)
    {
    if (a <= p(c) & b >= p(c)) return 1
    else return 0
    }

    if (blafunction(5,7,2)){ das was passieren soll wenn die Variable mit der Bezeichnung 2 einen Wert zwischen 5 und 7 hat }

    oder noch einfacher, hat ruby keine &-Verknüpfung oder sowas in der Art?

  9. #9
    @Dhan:
    Eben das gibt es doch schon, bloß eben Objektorientiert :P
    Comparable#between? heißt die Methode, ich nehme mal an, dass das intern so aussehen würde:
    Code:
    module Comparable
      def between?(a,b)
        return (self >= a and self <= b)
      end
    end
    (und nein, dass ist keine fiktiv einfache Syntax =D)

    Edit:
    Falls es tatsächlich jemanden interessiert (?) hab eben mal im Sourcecode nachgeschlagen, die Methode ist wie folgt in C implementiert:
    Code:
    static VALUE
    cmp_between(x, min, max)
        VALUE x, min, max;
    {
        if (RTEST(cmp_lt(x, min))) return Qfalse;
        if (RTEST(cmp_gt(x, max))) return Qfalse;
        return Qtrue;
    }
    ...Ich finde die Ruby Lösung doch etwas eleganter, aber k.

    Geändert von Der Drake (07.04.2006 um 10:34 Uhr)

  10. #10
    @Der Drake: Gut zu wissen, mit dem >include?<, hoffentlich erinnere ich mich daran wenn ich's tatsächlich mal brauche. In diesem Fall hat letztlich doch eine >OR< Anweisung gereicht, da ich den Bereich ohnehin in 2er Blocks aufteilen musste.

    Das muss man dann im Conditional Branch übrigens so abfragen:

    Code:
    $game_variables[10] == 2 OR $game_variables[10] == 4
    Irgendeiner 'ne Ahnung warum ich nicht einfach

    Code:
    $game_variables[10] == 2 OR 4
    oder so schreiben kann? Da ignoriert er alles nach der 2 nähmlich aus irgendeinem Grund...

  11. #11
    Zitat Zitat von Lil_Lucy
    Irgendeiner 'ne Ahnung warum ich nicht einfach

    Code:
    $game_variables[10] == 2 OR 4
    oder so schreiben kann? Da ignoriert er alles nach der 2 nähmlich aus irgendeinem Grund...
    Nunja, der Ausdruck da oben ist zuerst mal kein richtiges Ruby, du kannst es vielleicht sehr schön lesen, aber aus der Sicht des Interpreters ist das ganze etwas anders.
    Da OR eine niedriege Rangfolge hat, wird zuerst die linke Seite ausgeführt. Dein Ausdruck wird also wie folgt gelesen:
    Code:
    ($game_variables[10] == 2) or (4)
    was du allerdings nicht wirklich damit ausdrücken wolltest. ^^°

  12. #12
    Könnte ich dann eventuell

    Code:
    $game_variables[10] == (2 OR 4)
    schreiben? Oder macht er das auch nicht?

  13. #13
    Zitat Zitat von Lil_Lucy
    Könnte ich dann eventuell

    Code:
    $game_variables[10] == (2 OR 4)
    schreiben? Oder macht er das auch nicht?
    Nein, was soll man mit einem Ausdruck wie (2 Und 4) auch anfangen? Der Interpreter ist auch der Meinung, dass das keinen Sinn macht und gibt dir einen Syntax Error zurück.
    Ruby hat meines Wissens auch keine spezielle Syntax für so etwas, deshalb muss man es eben anders lösen. ^^"

Berechtigungen

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