PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ruby spezieller Befehl verzweifelt gesucht



Elster
14.01.2013, 21:50
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/3904-custom-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.

FlipelyFlip
14.01.2013, 22:52
wenn er in der Heldengruppe ist, dann kannste das so machen:


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

Elster
15.01.2013, 12:59
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 :D

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

Doktor von Stein
15.01.2013, 18:22
Dafür musst du den Code von Flip nur geringfügig verändern.


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

-KD-
15.01.2013, 21:38
# 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


Kann man if/ else eigentlich in Ruby verschachteln Oo? Ich denke mal ja und hoffe es inständig XD Ja, klar.

Elster
15.01.2013, 23:15
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.


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

FlipelyFlip
16.01.2013, 00:31
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:


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 (:

Elster
16.01.2013, 08:19
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:

eval(script)

Wenn ich diese Zeile auskommentiere geht es wieder.

$game_party.remove_actor ($game_party.all_members[position].id)
16545

FlipelyFlip
16.01.2013, 09:41
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.


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.

Elster
16.01.2013, 09:49
Arf blöder Fehler XD
Aber danke an euch Zwei für die schnelle und gute Hilfe ^^

FlipelyFlip
16.01.2013, 09:59
mit dem Problem kämpf ich selber oft ;D

kein Problem, immer wieder gerne (:

-KD-
16.01.2013, 10:10
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.

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:

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


$game_party.remove_by_name "Ratte"

Elster
16.01.2013, 19:29
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 ^^