Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Hilfe mit: RPG-Maker VX Message System
Guten Abend.
Das ist beinahe peinlich, aber wie es aussieht, bin ich nicht in der Lage das Message-System des VX zu verstehen.
Ich will nichts weiter als eine Message-Box in einer eigenen Szene erstellen und verwalten.
Ich hoffte es auf die einfach Art und Weise regeln zu können und schrieb folgenden Code:
@dialogue_window = Window_Message.new
$game_message.face_name = ""
$game_message.face_index = 0
$game_message.background = 0
$game_message.position = 2
$game_message.texts.push("Test")
Und war ersteinmal sehr zufrieden, da es sehr wohl funktioniert hat.
Doch dann, wenn ich die Nachricht beende, einige andere Aktionen ausführe, und es Zeit wird die nächste Nachricht darzustellen kommt die böse Überraschung. Die Message wird nichtmehr angezeigt.
Ich habe seit Tagen daran gesessen und alles mögliche versucht.
Unzählige Debug-Messages an allen möglichen Stellen zeigen mir, dass alles einwandfrei läuft; mit der winzigen Ausnahme, dass man nichts sehen kann.
Der Text wird korrekt eingelesen und es wird darauf gewartet, dass ich Enter (oder Äquivalent) drücke, und dann wird das Fenster wieder geschlossen. Aber alles ohne irgendetwas anzuzeigen.
Es wird dabei auch nichts an dem Fenster in der zwischenzeit verändert.
Das Fenster hat keinen Viewport, es gibt keine anderen Grafiken (in dieser Testphase) welche es überdecken könnten.
Ich bin völlig verzweifelt. Ich bin beinahe soweit das Fenster für jede Nachricht neu zu erstellen.
Ich bitte dringendst um Hilfe oder ich werde verrückt.
Inflater
21.05.2012, 12:03
Hast Du Dein Problem bereits gelöst?
Ich bin jetzt kein Ruby-Experte, aber etwas kommt mir an dem Code komisch vor:
Du erzeugst ein Objekt namens »dialoge_window« aus der Klasse »Window_Message«. Aber in der nächsten und den darauf folgenden Zeilen benutzt Du dieses Objekt gar nicht, sondern ein Objekt namens »game_message«. Dein Code funktioniert zum Beispiel auch – übrigens auch mehrfach – wenn Du die erste Zeile einfach weg lässt.
Kann es etwas damit zu tun haben?
Wie immer,
The Inflater
Netter Versuch, hilft allerdings nicht.
Das dialogue_window ist lediglich eine Anzeigehilfe ohne Inhalt. Der tatsächliche Text und die dazugehörigen Daten werden in dem RPG-Maker XP/VX/ACE nämlich in einer separaten Game_Message-Klasse abgespeichert. Das ist auch gut und richtig so.Das Problem ist nur wie diese beiden Klassen in dem Maker miteinander verbunden wurden und Änderungen an der Game-Message leider nicht direkte Auswirkungen an dem Fenster haben wo sie dargestellt werden.
Da braucht man schon ein paar Kenntnisse darüber wie der Maker intern gescriptet ist, raten hilft meist leider nur wenig.
Inflater
21.05.2012, 15:17
... Da braucht man schon ein paar Kenntnisse darüber wie der Maker intern gescriptet ist, raten hilft meist leider nur wenig.
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
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.
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.
def initialize
super(0, 288, 544, 128)
self.z = 200
self.active = false
self.index = -1
self.openness = 0
@opening = false # WIndow opening flag
@closing = false # Window closing flag
@text = nil # Remaining text to be displayed
@contents_x = 0 # X coordinate for drawing next character
@contents_y = 0 # Y coordinate for drawing next character
@line_count = 0 # Line count drawn up until now
@wait_count = 0 # Wait count
@background = 0 # Background type
@position = 2 # Display position
@show_fast = false # Fast forward flag
@line_show_fast = false # Fast forward by line flag
@pause_skip = false # Input standby omission flag
create_gold_window
create_number_input_window
create_back_sprite
end
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.
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.
Ah, okay. Ich dachte du verwendest den RPGMaker VX Ace - was übrigens zu empfehlen ist. Der Scripteditor dort sieht wirklich bedeutend hübscher aus. Außerdem verwendet er Ruby 1.93. Aber klar, ist natürlich vor allem auch eine Geldfrage.
Das Problem ist aber im Grunde genommen das Gleiche: Beim Starten der Message werden alle Informationen aus Game_Message geholt. Beim Beenden der Message werden die Informationen in Game_Message wieder gelöscht. Das heißt: Fügst du neue Texte ein, während dein Window_Message eine Textnachricht anzeigt, so werden diese Änderungen nicht übernommen. Aber genaueres zum Fehler kann ich nur sagen wenn ich den Code sehe (zumal ich selbst nur den RPGMaker XP besitze, bei allen anderen Maker habe ich lediglich den Quellcode des Scripteditors, kann also nichts ausprobieren).
Die Scene ist relativ groß, und nur sehr wenig hat mit der Message zu tun.Dann leg eine neue Szene an, die nur dein Message-System enthält. Das ist sowieso eine ganz gute Vorgehensweise um den Fehler zu lokalisieren.
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.