Ergebnis 1 bis 3 von 3

Thema: [XP]-Problem: Array-Inhalt wird durch Code von Window_Message schrittweise gelöscht

Hybrid-Darstellung

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

    [XP]-Problem: Array-Inhalt wird durch Code von Window_Message schrittweise gelöscht

    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. ^^"

  2. #2
    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:
    Code:
    text = $gametext.get_text2(b.to_i).dup
    Mit dup wird eine Kopie des Textes angelegt.

  3. #3
    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).

Berechtigungen

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