PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dynamisch erzeugte Events verhalten sich komisch



DFYX
21.05.2009, 23:21
Ich hab seit langem mal wieder den XP ausgegraben und mit RGSS rumgespielt. Ich wollte mal testen, ob ich es schaff, Events zur Laufzeit dynamisch zu erzeugen. Meine Versuche, die Events komplett selbst zu erstellen, sind leider nicht sonderlich gut verlaufen, aber mit einem Event Spawner (http://www.creationasylum.net/index.php?showtopic=3910) Script, das ich bei der Recherche zufällig entdeckt hab, ging das dann letztendlich auch. Zur Übung hab ich ein Script gebastelt, das beim Betreten einer Map ein Event erstellt, das dem Spieler folgt. Das eigentliche Folgescript sieht in etwa so aus:

(Pseudocode, weil das Ganze ein Gemisch aus Ruby und normalem Event Script ist)

if event.x != player.x || event.y != player.y
wait 3
loop
if event.x != player.x || event.y != player.y
move towards_player
wait 1
else
goto Ende
end if
end loop
end if
label Ende

Das Event hat keine Kollision und das Script wird als Parallel Process ausgeführt. Damit Steht es an der gleichen Stelle wie der Spieler, wenn er steht und folgt ihm mit etwa einem Tile Abstand, wenn er sich bewegt.

Mit einem Event, das ich direkt auf die Map setze, funktioniert das wunderbar, aber bei dem dynamisch erzeugten Map scheinen die waits nicht richtig zu passen. Der Abstand beim Loslaufen ist zu klein und mit der Zeit wird das Event immer weiter abgehängt. Zwei verschiedene dynamisch erzeugte Events verhalten sich aber untereinander exakt identisch, es kann also eher keine zufällig auftretende Verzögerung sein. Ich kann mir wirklich nicht erklären, was da los ist. Die Events sollten eigentlich exakt identische Werte und Scripts haben.

Ich hab mein Testprojekt mal hochgeladen (http://www.wecallit42.de/temp/Dynamic.zip). Das Event mit den braunen Haaren ist das, das direkt im Maker erstellt wurde, das mit den grünen Haaren das dynamisch erzeugte. Die Erzeugung läuft in den Scripts Spawn_Event und Follower (ganz unten in der Liste). Zusätzlich hab ich von jedem Event einen Dump der jeweils aktiven Seite als txt mit ins Archiv gepackt (Erstellt mit File.new("xxx.txt", "w").write($game_map.events[id].list.inspect))

Ascare
22.05.2009, 12:23
Lustiges Script. Wenn man statt

@event.list(1, 106, [3]) #wait 3
einen Wait von 2 macht, dann bewegt sich das dynamische Event synchron zum Spieler und wird nicht mehr abgehängt, jedoch klebt es zu sehr am Arsch des Helden. Kannst du was damit anfangen?

DFYX
22.05.2009, 14:27
Ja, ist mir auch schon aufgefallen und macht die Sache nur noch mysteriöser. Das spricht irgendwie dafür, dass die Schleife zum falschen Zeitpunkt verlassen wird. Ich werd mir das nochmal im Detail anschaun.

Edit:
Ich hab das Problem gefunden. Ich hatte erst angenommen, dass @indent nur für die korrekte Darstellung im Maker zuständig ist, aber das spielt auch bei der Verarbeitung eine Rolle. Wenn Commands nicht eingerückt sind, werden umstehende ifs ignoriert. Dementsprechend wurden sowohl if- als auch else- Block ausgeführt. Ich hab das Skript jetzt entsprechend modifiziert und siehe da, es funktioniert. Jetzt habe ich ein Partymitglied, das mir auf allen Maps folgt, ohne, dass ich es extra einfügen muss. Ich werde noch ein paar Veränderungen vornehmen und es dann vorstellen.