Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [XP]-Problem: Array-Inhalt wird durch Code von Window_Message schrittweise gelöscht



faerith
17.06.2011, 00:50
Mein Problem: Ich habe mir eine Klasse namens Gametext geschrieben welche aus einer formatierten
externen Textdatei den Inhalt für die Textboxen extrahiert und in einem multidim. (Hash)Array
speichert. Aber, sobald Window_Message mit refresh durch ist, ist der aufgerufene Arrayinhalt wech.

Sprich, eines NPC's Inhalt von EventCommand Showtext ist zB der Text "\no[0]" über den dann der
eigentliche Inhalt für diese Textbox über den Gamtext Arrays, mithilfe der Zahl in \no[#], bestimmt werden kann
(zusammen mit den Mapnamen).

# Dementsprechen wurde Window_Message um folgenden Code erweitert:
# If waiting for a message to be displayed
if $game_temp.message_text != nil
text = $game_temp.message_text
# ----- Text aus externer Quelle generieren
if text[/\\no\[\d+\]/] != nil #yay, \no[#]
text[/\\no\[/]=""
text[/\]/]=""
b = text
text = $gametext.get_text2(b.to_i) #übergabe von Teil des Array-Keys
end
# Control text processing

soweit so gut (und in der Textbox im Spiel wird der Text auch korrekt angezeigt), aber sobald
while ((c = text.slice!(/./m)) != nil) von Window_Message
erreicht wird, "frißt" c = text.slice!(/./m)) den text im Array von $gametext bei jeder Iteration
Schrittweise ("Anfangsbuchstabe" für "Anfangsbuchstabe") auf ... ? (durch viele Test-prints rausgefunden)
Entsprechend ist der Text des NPCs beim nächsten Ansprechen ein leerer (nicht nil) String.
Das macht für mich irgendwie keinen Sinn(außer Vodoo?), denn get_text soltle doch der einzige Zugriff auf den
Array sein... .
Aber vielleicht hat da ja jemand eine Idee, warum's tut was es tut.
(am multidim. Array liegts nicht, ich hab auch einen 1D-Array ausprobiert)

Ich hoffe das war jetzt halbwegs verständlich. ^^"

-KD-
17.06.2011, 15:53
In Ruby wird grundsätzlich per reference, nicht per value übergeben. Wenn du also aus irgendeinem Objekt (z.B. einem Array) ein anderes Objekt holst und dieses manipulierst, wirkt sich das auch auf den Inhalt des Arrays aus. Willst du auf einer Kopie des Strings im Array arbeiten, musst du das explizit sagen:

text = $gametext.get_text2(b.to_i).dup
Mit dup wird eine Kopie des Textes angelegt.

faerith
17.06.2011, 17:46
Auch wenn ich gerade vor 5 minuten .dup ausprobiert habe,
Danke für die Erklärung, -KD- =)
Jetzt bin ich für später vorgewarnt (andere Sprachen (die ich kenne) machen sowas nicht).