Ergebnis 1 bis 13 von 13

Thema: Ruby spezieller Befehl verzweifelt gesucht

  1. #1

    Ruby spezieller Befehl verzweifelt gesucht

    Hallo zusammen.
    Ich habe mir für ein Spiel 2 Scripte aus dem Netz gezogen, da ich mich selber fast gar nicht mit Ruby auskenne. Für den VX.Ace
    Script 1 dient dem Fangen von Monstern: http://www.rpgmakervxace.net/topic/3905-monster-hunter/
    Script 2 erstellt eine eigenständige Datenbank, mit eben den gefangenen Monstern. http://www.rpgmakervxace.net/topic/3...stom-database/
    Nun weiß ich leider nicht, wie ich auf genau diese Monster zugreifen soll. Ihre ID könnte ich noch erraten am Anfang aber mit der Zeit ist das weder praktisch noch realistisch.
    Da das erste Script auch noch einen schönen Fehler hat, dass mein Fangenzauber gerne mal daueraktiv ist, quillt meine Heldengruppe schnell über und ich weiß nicht wie ich die loswerden soll! Ok eine nützliche Idee um die überzähligen Monster zu verwalten habe ich, nur kann ich die nicht umsetzen, wenn ich es nicht schaffe auf sie zuzugreifen.
    Also lautet meine Frage, gibt es einen Befehl in Ruby, mit dem ich nach einen Namen eines Gruppenmitgliedes, z.B. "Ratte" suchen kann, ohne dessen ID zu kennen?
    Wenn das im Maker möglich ist, bin ich schon einen großen Schritt weiter.
    Ich kann ja auch nicht einfach sagen, dass ein Switch angeht, wenn so jemand in meiner Gruppe ist, da ich nicht weiß ob sich so jemand in meiner Gruppe befindet vor dem Start des Spiels.

    Danke schon mal im Voraus.

  2. #2
    wenn er in der Heldengruppe ist, dann kannste das so machen:

    Code:
    for a in $game_party.all_members
      if a.name == "Name"
        dein scriptcode
      end
    end
    dadurch prüfst du jedes einzelne Mitglied der Party durch, ob der Name des Charakters den gesuchten Namen hat.

    Hoffe ich konnte dir Helfen

    lg flipy

  3. #3
    Danke, danke sehr hilfreich ^^
    Gibt es auch eine Möglichkeit zu überprüfen, ob sich der Char an Platz 1 - 4 befindet?
    Weil ich will z.B. nicht alle meine Ratten auf einmal aus meiner Gruppe werfen

    Müsste ja was mit if....... else.... sein.
    Kann man if/ else eigentlich in Ruby verschachteln Oo? Ich denke mal ja und hoffe es inständig XD

    Geändert von Elster (15.01.2013 um 12:20 Uhr)

  4. #4

    Doktor von Stein Gast
    Dafür musst du den Code von Flip nur geringfügig verändern.
    Code:
    for a in 0..$game_party.all_members.size-1
      if $game_party.all_members[a].name == "Name"
        dein scriptcode
      end
      if a == Deine_Zahl
        do_whatever
      end
    end
    (Ich arbeite sonst nur mit RGSS1, aber das sollte eigentlich funktionieren.)

    MfG
    Doktor von Stein

  5. #5
    Code:
    # gib Index des Actors mit Namen Ratte
    position = $game_party.all_members.find_index {|actor| actor.name == "Ratte"}
    # Wenn Index zwischen 0 bis 3 liegt
    if position <= 3
      # dein Code
    end
    Zitat Zitat
    Kann man if/ else eigentlich in Ruby verschachteln Oo? Ich denke mal ja und hoffe es inständig XD
    Ja, klar.

  6. #6
    Ok... das Ergebnis ist interessant das dabei heraus kommt.
    Also folgendes passiert mir bei diesem Code:
    1. Nur wenn eine Ratte auf Position 2 in der Gruppe steht (id1) wird jemand aus der Gruppe entfernt und zwar der, der an Position 1 (id0) steht.
    2. Wenn jetzt eine Ratte nun id 2 oder 3 hat, bekomme ich den Gegenstand da, aber keiner wird aus der Gruppe geworfen.

    Ich finde das sehr interessant und sehr seltsam. Oo
    Habe ich einen falschen Befehl genutzt um jemanden aus der Gruppe zu werfen? Weil ich denke nicht, dass der Fehler weiter oben liegt.
    Code:
    position = $game_party.all_members.find_index {|actor| actor.name == "Ratte"}
    if position <= 3
         item = $data_items[100]
         $game_party.gain_item(item, 1) 
         $game_party.remove_actor(position)
    end

  7. #7
    Achtun!! Der Befehl remove_actor entfernt nur den Helden mit der ID, nicht nach position. da musste eben wie ich oben geschriebn haben machen, oder aber noch die Actor ID mit weiter geben, denn zurzeit würdest du folgendes machen:

    sagen wir mal die ID des Helden mit dem Namen Ratte ist 7. Du überprüfst nun den Namen in der Party und guckst durch. Du stößt auf den Namen und überprüfst auf welcher Position er ist. Gut, er ist in der Gruppe auf Position Nr. 2 zB. jetzt machst du $game_party.remove_actor(position). position hat den Wert 2. Es entfernt im Endeffekt den Helden mit der ID 2. Um das zu machen was du willst, könntest du zB. folgendes machen:

    Code:
    position = $game_party.all_members.find_index {|actor| actor.name == "Ratte"}
    if position <= 3
         item = $data_items[1]
         $game_party.gain_item(item, 1) 
         $game_party.remove_actor($game_party.all_members[position].id)
    end
    Das dürfte dein Problem lösen (:

  8. #8
    Wirft leider eine Fehlermeldung, mit der ich nicht viel anfangen kann.
    (Habe den Code vonFliperlyFlip so übernommen wie er da steht)

    Die Zeile auf die sich der Fehler bezieht sieht wie folgt aus:
    Code:
     eval(script)
    Wenn ich diese Zeile auskommentiere geht es wieder.
    Code:
    $game_party.remove_actor ($game_party.all_members[position].id)
    Klicke auf die Grafik für eine größere Ansicht 

Name:	Fehlermeldung.png 
Hits:	25 
Größe:	5,5 KB 
ID:	16545

  9. #9
    ach ich weiß wo dein Problem liegt.

    wenn du das so in das Call-Script Feld eingibst, werden einige Sachen so verrutscht, dass der Maker die Zusammenhänge gar nicht kennt.

    Code:
    position = $game_party.all_members.find_index {
    |actor| actor.name == "Ratte"}
    if position <= 3
         item = $data_items[100]
         $game_party.gain_item(item, 1) 
         $game_party.remove_actor(
    $game_party.all_members[position].id)
    end
    so dürfte es auf jedenfall klappen. Wenn du mitm Call Script arbeitest und dir Befehle zu lang werden für eine Zeile. Schau dass du diese immer bei ner offenen Klammer oder nem Beistrich umbrechen kannst. Dadurch weiß der Maker, dass da noch was kommen wird und liest die nächste Zeile solange mit, bis die Klammer zu ist.

  10. #10
    Arf blöder Fehler XD
    Aber danke an euch Zwei für die schnelle und gute Hilfe ^^

  11. #11
    mit dem Problem kämpf ich selber oft

    kein Problem, immer wieder gerne (:

  12. #12
    Habe noch etwas vergessen: Du musst noch prüfen ob der Actor überhaupt in der Party ist. Andernfalls würde find_index nil zurückgeben und der Vergleich nil <= 3 schlägt fehl.
    Code:
    position = $game_party.all_members.find_index {|actor| actor.name == "Ratte"}
    if position && position <= 3
         item = $data_items[1]
         $game_party.gain_item(item, 1) 
         $game_party.remove_actor($game_party.all_members[position].id)
    end
    Du kannst den Code auch direkt in die Game_Party Klasse packen. Dann hast du kein so langes Call-Script mehr:
    Code:
    class Game_Party
      def remove_by_name name
        position = all_members.find_index {|actor| actor.name == name}
        if position && position <= 3
          item = $data_items[1]
          gain_item(item, 1) 
          remove_actor(all_members[position].id)
        end
      end
    end
    Code:
    $game_party.remove_by_name "Ratte"

  13. #13
    Danke für den Hinweis, ist mir noch gar nicht aufgefallen Oo
    Ich bleibe bei der ersten Version, die macht mir den Umgang mit den Gegenständen bei meinen momentanen Wissensstand noch leichter ^^
    Klar, ich könnte sicher die id des items mit übergeben aber... ich mag die Lösung so wie sie gerade ist ^^

    Danke nochmal ^^

Stichworte

Berechtigungen

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