Hm, du müsstest mal die ganze Scene zeigen. Prinzipiell scheint es so zu sein, dass Window_Message sich beim Starten alle Texte, die in Game_Message abgelegt sind, holt und die dann zeichenweise zeichnet. Wenn währendessen Game_Message verändert wird, hat das keinen Einfluss mehr auf Window_Message. Wenn Window_Message mit dem Schreiben fertig ist, löscht es den Inhalt von Game_Message. Erst danach kannst du Game_Message mit neuem Inhalt füllen.
...
Die Scene ist relativ groß, und nur sehr wenig hat mit der Message zu tun. Ich habe vorerst darauf zurückgegriffen das Window für jede neue Nachricht neu anzulegen. Funktioniert, ist aber nicht sonderlich hübsch.
Hier ein paar Auszüge aus der Window_Message Klasse.
Im Initialize wird nichts mit dem Text angestellt, daher gehe ich davon aus, dass man es eigentlich nicht neu initialisieren muss um einen neuen Text darstellen zu können.
Das Problem ist nur, die Stelle zu finden wo genau etwas mit dem Text gemacht wird. Denn das ist im VX sehr umständlich gelöst und man verfolgt den Code auf der Suche nach der @text-Referenz um zwanzig Ecken.
Soweit ich den Code analysieren konnte muss lediglich die Game_Message Instanz bearbeitet werden und dann die Update-Methode des Message_Window gerufen werden. Das funktioniert jedoch leider nicht so ganz.
Den Schluss hatte ich aus dem Update gezogen welches nämlich wie folgt aussieht:
def update
super
update_gold_window
update_number_input_window
update_back_sprite
update_show_fast
unless @opening or @closing # Window is not opening or closing
if @wait_count > 0 # Waiting within text
#print("update wait")
@wait_count -= 1
elsif self.pause # Waiting for text advancement
#print("update pause")
input_pause
elsif self.active # Inputting choice
input_choice
elsif @number_input_window.visible # Inputting number
input_number
elsif @text != nil # More text exists
#print("update message")
update_message # Update message
elsif continue? # If continuing
#print("update continue")
start_message # Start message
open # Open window
$game_message.visible = true
else # If not continuing
close # Close window
$game_message.visible = @closing
end
end
end
Da steht so schön in einer Zeile:
elsif continue? # If continuing
start_message # Start message
open # Open window
$game_message.visible = true
Das Continue ist definiert als:
def continue?
return true if $game_message.num_input_variable_id > 0
return false if $game_message.texts.empty?
if self.openness > 0 and not $game_temp.in_battle
return false if @background != $game_message.background
return false if @position != $game_message.position
end
return true
end
Was nach meinen Eingaben in die Game_Message true liefern sollte.
Und demnach das Start_Message:
def start_message
@text = ""
for i in 0...$game_message.texts.size
@text += " " if i >= $game_message.choice_start
@text += $game_message.texts[i].clone + "\x00"
end
@item_max = $game_message.choice_max
convert_special_characters
reset_window
new_page
end
Wo wir nun auch endlich unseren Text geladen bekommen.
Und wie wir bereits im Update gesehen haben wird der Text gezeichnet unter der Vorraussetzung dass:
elsif @text != nil # More text exists
update_message
Weshalb ich wirklich sehr verdutzt bin warum es so nicht funktionieren sollte.
Zitat von Inflater
Und pampig werden ist auch keine Lösung. Vor allem wenn jemand seine Zeit opfert, um Dein Problem zu lösen. Solltest Du mal drüber nachdenken.
Davon mal abgesehen: Wenn ich Deinen Code repliziere – egal ob mit erster Zeile oder ohne – und in der Text-Ausgabe verändert in mehrere Events packe (zum Beispiel »Test 1«, »Test 2«, »Test 3«), dann wird genau diese Texte immer angezeigt. Egal wie viele andere Events dazwischen vorkamen.
Benutzt Du Dein Code-Schnipsel in einem anderen Objekt oder direkt in einem Event? Oder kann es sein, dass ich den »VX Ace« benutze, Du aber den »VX« (ohne »Ace«)?
Wie immer,
The Inflater
...
Ich glaube du scheinst nicht sonderlich zu verstehen was ich da getan habe. Bitte lerne dich lieber etwas genauer in die Materie ein.
Events kommen in meinem Projekt garnicht vor, die Engine (dieser speziellen Szene) ist von Grund auf (bis auf eben die Ausnahme des Message-Scriptes aus Kompatibilitätsgründen) selbst in Ruby gescriptet.
Das du deine Zeit "geopfert" hast ist schön und gut, ist auch sehr redenswert von dir aber hilfreich war es nunmal nicht, dass muss man einsehen, auch wenn es gut gemeint sein mag.