Kriege ne Krise mit dem Event ! Brauche mal bitte Hilfe ^^
Hi Leute ! Ich komm gleich zur Sache. Folgende Situation:
Mein Held hat eine Spitzhacke in der Hand und fuchtelt damit fröhlich in der Gegend rum wenn man die "F" Taste drückt. (Alle-Tasten-Script)
Sobald ihm ein Felsen im Weg steht kann er diesen mit der Spitzhacke zerstören. So... das klappt auch "fast" wunderbar. Steht der Held links vom Felsen und guckt nach rechts, drückt man also die F-Taste und der Felsen ist kaputt. ^^ Das ganze funktioniert auch wenn er rechts vom Felsen steht und auch wenn er über dem Felsen steht, es funktioniert nur nicht wenn er unter dem Felsen steht (und halt nach oben schaut). Warum weiß ich nicht. Ich habe den Code nun schon etliche male nach Fehlern durchsucht und einfach nichts gefunden. Ich bitte die jenigen, die etwas Ahnung von Event-Scripting haben, mal den Code durchzuschauen. Ich hoffe auch Hilfe
Hier das Event "Stein1"

Das Event hat halt noch eine 2. Seite die dann also mit dem "Stein1_kaputt"-Switch aktiviert wird. Die Seite ist leer und ohne Grafik. Die Hero X/Y Werte sind in einem seperaten Parallel Process-Event als Variable gespeichtert. Ich gehe ja eigtl. davon aus das der Fehler im markierten Bereich sein sollte. Ist er "meiner Meinung nach" aber nicht. Oder bin ich doch blind !?^^Ich hab echt keine Ahnung warum das nicht funktioniert. Zumal ja auch keine anderes Event o.ä. dazwischen funkt. Wie gesagt die anderen Richtungen funzen doch auch. Warum denn die nicht !? ^^
Mein Held hat eine Spitzhacke in der Hand und fuchtelt damit fröhlich in der Gegend rum wenn man die "F" Taste drückt. (Alle-Tasten-Script)
Sobald ihm ein Felsen im Weg steht kann er diesen mit der Spitzhacke zerstören. So... das klappt auch "fast" wunderbar. Steht der Held links vom Felsen und guckt nach rechts, drückt man also die F-Taste und der Felsen ist kaputt. ^^ Das ganze funktioniert auch wenn er rechts vom Felsen steht und auch wenn er über dem Felsen steht, es funktioniert nur nicht wenn er unter dem Felsen steht (und halt nach oben schaut). Warum weiß ich nicht. Ich habe den Code nun schon etliche male nach Fehlern durchsucht und einfach nichts gefunden. Ich bitte die jenigen, die etwas Ahnung von Event-Scripting haben, mal den Code durchzuschauen. Ich hoffe auch Hilfe

Hier das Event "Stein1"

Das Event hat halt noch eine 2. Seite die dann also mit dem "Stein1_kaputt"-Switch aktiviert wird. Die Seite ist leer und ohne Grafik. Die Hero X/Y Werte sind in einem seperaten Parallel Process-Event als Variable gespeichtert. Ich gehe ja eigtl. davon aus das der Fehler im markierten Bereich sein sollte. Ist er "meiner Meinung nach" aber nicht. Oder bin ich doch blind !?^^Ich hab echt keine Ahnung warum das nicht funktioniert. Zumal ja auch keine anderes Event o.ä. dazwischen funkt. Wie gesagt die anderen Richtungen funzen doch auch. Warum denn die nicht !? ^^
Wann weist du den Variablen "Spieler X" und "Spieler Y" die Werte zu?
Schau am besten mal mithilfe des Debug-Menüs (F9 im Testspiel) nach ob "Spieler Y" den richtigen Wert enthält...
Btw: da du die Heldenkoordinaten sowieso noch in "Control Variables" verrechnest könntest du dort eig. sogar direkt mit der Spielerposition arbeiten
ED: noch etwas aufgefallen:
Im zweiten CB fragst du ab, ob "Stein X" gleich 0 ist. Unter "Else" fragst du allerdings das Gleiche nocheinmal für den Fall ab dass der Held unterhalb des Felsens steht...
Da "Stein X" nicht gleichzeitig gleich 0 und ungleich 0 sein kann wird die in rot eingefasste Codestelle folglich niemals ausgeführt.
Schau am besten mal mithilfe des Debug-Menüs (F9 im Testspiel) nach ob "Spieler Y" den richtigen Wert enthält...
Btw: da du die Heldenkoordinaten sowieso noch in "Control Variables" verrechnest könntest du dort eig. sogar direkt mit der Spielerposition arbeiten

ED: noch etwas aufgefallen:
Im zweiten CB fragst du ab, ob "Stein X" gleich 0 ist. Unter "Else" fragst du allerdings das Gleiche nocheinmal für den Fall ab dass der Held unterhalb des Felsens steht...
Da "Stein X" nicht gleichzeitig gleich 0 und ungleich 0 sein kann wird die in rot eingefasste Codestelle folglich niemals ausgeführt.
Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »Irrlicht« (10. September 2010, 08:48)
ok.. lösch deinen code komplett.. und code das hier nach:

Effizienter, Zeilenschonender und Übersichtlicher!
Effizienter, Zeilenschonender und Übersichtlicher!
There was a Cave,
below a Silent's Grave.
Tunnels, extending far, running wide,
going deep into the World on the other Side.
Poor little Child, that was to brave,
died painfully deep down, in the Devil's Cave.
below a Silent's Grave.
Tunnels, extending far, running wide,
going deep into the World on the other Side.
Poor little Child, that was to brave,
died painfully deep down, in the Devil's Cave.
@Genocide: Ohne dass ich nun wüsste wie schnell nun deine Variante gegenüber Callscript ist: in dem Fall dürfte der Unterschied realtiv gesehen wirklich extrem minimal sein... ...zumal die betreffende Stelle sowieso nur abgefragt wird wenn die F-Taste gedrückt wurde...
(wobei ich in diesem Fall aber aus Prinzip schon vorschlagen würde hier mit "Button Input Processing" anstatt der Tastenabfrage des CB zu arbeiten... aber das wäre hier eher eine spieltechnische Änderung)
ED nach unten:
Wenn du trigger verwendest solltest du aber aufs "Wait" verzichten, sonst besteht eine Chance dass ein Tastendruck wärend des 2-Frame-Wait geschluckt wird...
ED2: Wurde eines besseren belehrt^^
(wobei ich in diesem Fall aber aus Prinzip schon vorschlagen würde hier mit "Button Input Processing" anstatt der Tastenabfrage des CB zu arbeiten... aber das wäre hier eher eine spieltechnische Änderung)
ED nach unten:
Wenn du trigger verwendest solltest du aber aufs "Wait" verzichten, sonst besteht eine Chance dass ein Tastendruck wärend des 2-Frame-Wait geschluckt wird...
ED2: Wurde eines besseren belehrt^^
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Irrlicht« (10. September 2010, 12:46)
Es wird nicht immer wiederholt.. sondern nur wenn die F Taste gedrückt wird..
Hab den ganzen Block ned umsonst in eine if gepackt..
Achja.. selbst auf meinem arschlahmen Netbook habe ich erst mit 57 dieser Events einen Frame verlust.. von lansgam kann keine Rede sein XD
Und ob ich jetzt den Eventbefehl für Variablen nehme, der über 1 Command, das Event und den Interpreter laufen.. oder direkt Eval mittels direktem Call Script.. Ist kein unterschied.
Zudem verballert die scriptvariante nicht für jedes Event 2 variablen, sondern arbeitet als standalone mit eben diesen 4 variablen.
Kleiner Tipp noch nebenbei
NICHT ".press?" verwenden.. sondern ".trigger?"
Vorteil: Trigger setzt vorraus, das die taste auch wieder losgelassen wird. somit hat man den code wirklich nur einmalig bei tastenanschlag.
Hab den ganzen Block ned umsonst in eine if gepackt..
Achja.. selbst auf meinem arschlahmen Netbook habe ich erst mit 57 dieser Events einen Frame verlust.. von lansgam kann keine Rede sein XD
Und ob ich jetzt den Eventbefehl für Variablen nehme, der über 1 Command, das Event und den Interpreter laufen.. oder direkt Eval mittels direktem Call Script.. Ist kein unterschied.
Zudem verballert die scriptvariante nicht für jedes Event 2 variablen, sondern arbeitet als standalone mit eben diesen 4 variablen.
Kleiner Tipp noch nebenbei
NICHT ".press?" verwenden.. sondern ".trigger?"
Vorteil: Trigger setzt vorraus, das die taste auch wieder losgelassen wird. somit hat man den code wirklich nur einmalig bei tastenanschlag.
There was a Cave,
below a Silent's Grave.
Tunnels, extending far, running wide,
going deep into the World on the other Side.
Poor little Child, that was to brave,
died painfully deep down, in the Devil's Cave.
below a Silent's Grave.
Tunnels, extending far, running wide,
going deep into the World on the other Side.
Poor little Child, that was to brave,
died painfully deep down, in the Devil's Cave.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chaosgod Espér« (10. September 2010, 13:51)
Danke für eure Hilfe. Leider funktioniert das mit dem Script nicht @Chaosgod. Jedesmal wenn ich dann im Spiel die F Taste drücke, zeigt er mir n Syntax-Error Fehler.
Aber die gleiche Sache hab ich doch bei CB 3 & 4 auch ? nur halt mit Y = 0. Das funzt ja auch !? Also wenn Hero links,rechts, über event steht. Ich mein wie muss ich das denn ändern damit es auch für "unter Event" funzt !?
Zitat
Im zweiten CB fragst du ab, ob "Stein X" gleich 0 ist. Unter "Else" fragst du allerdings das Gleiche nocheinmal für den Fall ab dass der Held unterhalb des Felsens steht...
Da "Stein X" nicht gleichzeitig gleich 0 und ungleich 0 sein kann wird die in rot eingefasste Codestelle folglich niemals ausgeführt.
Das Problem ist die Reihenfolge bzw. die Position des "Elsecase": dort funktioniert es weil du dort ebenfalls zuerst die X-Koordinate abfragst, die in beiden Fällen jedoch einzigartige Werte haben:
Insgesamt sieht die Abfrage zZ. so aus:
- Wenn die X-Variable 0 ist überprüfe, ob der Held nach oben schaut und unterhalb des Events steht -> Ende
- wenn diese Variable nicht 0 ist überprüfe ob die X-Variable 0 ist, der Held nach unten schaut und oberhalb des Events steht -> finde den Fehler^^
- Wenn diese Variable immernoch nicht 0 ist überprüfe ob die X-Variable 1 ist, der Held nach rechts schaut und auf einer Höhe mit dem Event steht -> Ende
- Wenn diese Variable nicht 0 und nicht 1 ist überprüfe ob die X-Variable -1 ist, der Held nach links schaut und auf einer Höhe mit dem Event steht -> Ende
Am besten löst du es nach dem bereits von Esper vorgeschlagenen Prinzip:
- Wenn die Taste nicht gedrückt wurde mache gar nichts (wozu auch?)
- Berechne die Koordinaten des Events
- Berechne die Koordinaten des Helden und korrigiere sie so, dass die Koordinaten das Feld vor dem Helden angeben (mit dem dieser auch interagieren würde)
- frage ab ob die X- und Y-Koordinaten identisch sind und führe nur dann den "Zerstörungs"-code aus (wahlweise ziehe die Koordinaten des einen von den Koordinaten des anderen ab und überprüfe, ob als Differenz in beiden Fällen 0 herauskommt)
deine Vorteile:
- du musst die Position nur einmal überprüfen und nur einmal den "Zerstörungs"-code einfügen (deutlich kürzer und du verhaspelst dich nicht in widersprüchlichen Bedingungen^^)
Wenn du deinen Code im Grunde behalten willst gäbe es u.A. diese 2 Möglichkeiten:
- Du fragst auch bei oben/unten zuerst die Koordinate ab, die die jeweilige Richtung eindeutig festlegt (Y-Koordinate, da dort ein Wert von 1/-1 in keiner anderen Richtungsabfrage vorkommt)
- Du verzichtest auf "Elsecase" und schreibst alle 4 Richtungsabfragen untereinander (sodass alle 4 Richtungen abgefragt werden... evtl. zusammen mit "Exit Event Processing" am Ende des "Zerstörungs"-code)
Insgesamt sieht die Abfrage zZ. so aus:
- Wenn die X-Variable 0 ist überprüfe, ob der Held nach oben schaut und unterhalb des Events steht -> Ende
- wenn diese Variable nicht 0 ist überprüfe ob die X-Variable 0 ist, der Held nach unten schaut und oberhalb des Events steht -> finde den Fehler^^
- Wenn diese Variable immernoch nicht 0 ist überprüfe ob die X-Variable 1 ist, der Held nach rechts schaut und auf einer Höhe mit dem Event steht -> Ende
- Wenn diese Variable nicht 0 und nicht 1 ist überprüfe ob die X-Variable -1 ist, der Held nach links schaut und auf einer Höhe mit dem Event steht -> Ende
Am besten löst du es nach dem bereits von Esper vorgeschlagenen Prinzip:
- Wenn die Taste nicht gedrückt wurde mache gar nichts (wozu auch?)
- Berechne die Koordinaten des Events
- Berechne die Koordinaten des Helden und korrigiere sie so, dass die Koordinaten das Feld vor dem Helden angeben (mit dem dieser auch interagieren würde)
- frage ab ob die X- und Y-Koordinaten identisch sind und führe nur dann den "Zerstörungs"-code aus (wahlweise ziehe die Koordinaten des einen von den Koordinaten des anderen ab und überprüfe, ob als Differenz in beiden Fällen 0 herauskommt)
deine Vorteile:
- du musst die Position nur einmal überprüfen und nur einmal den "Zerstörungs"-code einfügen (deutlich kürzer und du verhaspelst dich nicht in widersprüchlichen Bedingungen^^)
Wenn du deinen Code im Grunde behalten willst gäbe es u.A. diese 2 Möglichkeiten:
- Du fragst auch bei oben/unten zuerst die Koordinate ab, die die jeweilige Richtung eindeutig festlegt (Y-Koordinate, da dort ein Wert von 1/-1 in keiner anderen Richtungsabfrage vorkommt)
- Du verzichtest auf "Elsecase" und schreibst alle 4 Richtungsabfragen untereinander (sodass alle 4 Richtungen abgefragt werden... evtl. zusammen mit "Exit Event Processing" am Ende des "Zerstörungs"-code)
Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »Irrlicht« (11. September 2010, 14:39)
Du solltest darauf achten, dass du in Espérs Event, beim letzten Conditional Branch:
@px == @ex && @py == @ey
schreibst. Also 2 Mal & anstatt nur 1 Mal.
&& wird halt bei den Event Commands nur als & angezeigt, und wenns nicht da ist gibts halt nen Syntax Error.
~ Dark Thunder
@px == @ex && @py == @ey
schreibst. Also 2 Mal & anstatt nur 1 Mal.
&& wird halt bei den Event Commands nur als & angezeigt, und wenns nicht da ist gibts halt nen Syntax Error.
~ Dark Thunder
Ein & reicht auch Dark Thunder, man sollte dann nur @px == @ex und @py == @ey ausklammern
denn & hat eine höhere priorität als == daher auch der Syntax Error denn wenn bei dieser Zeile @ex & @py zuerst überprüft werden wird es binär genommen und es kommt irgend eine Zahl raus und es würde folglich nur noch dran stehen @px == irgendeine_zahl == @ey, was zu einem Fehler führt.
Aber bei (@px == @ex) & (@py == @ey) werden die geklammerten Sachen zu boolean und dann logisch mit & verglichen was dann den selben Effekt hat wie zwei &&.
Aber jetzt zum eigentlichem Thema.
Bei Espers's Methode müsste er ziemlich viel Cut&Paste anwenden und es währe am schluss sogar noch mehr geschriebenes als bei derMethode von Nebulaz, wobei ich nicht ganz verstehe wieso du abfrägst ob der Stein vor jemanden liegt. Naja auf jeden Fall meine Idee hier zu währe:
Über Main.
Jetzt musst du in jedem Event nur noch abfragen ob @in_the_area auf true steht um dann die animation von deinem Player in nem common event abzuspielen. Das ganze dann mit Parallelprocess.
|
|
Ruby Quellcode |
1 |
(@px == @ex) & (@py == @ey) |
denn & hat eine höhere priorität als == daher auch der Syntax Error denn wenn bei dieser Zeile @ex & @py zuerst überprüft werden wird es binär genommen und es kommt irgend eine Zahl raus und es würde folglich nur noch dran stehen @px == irgendeine_zahl == @ey, was zu einem Fehler führt.
Aber bei (@px == @ex) & (@py == @ey) werden die geklammerten Sachen zu boolean und dann logisch mit & verglichen was dann den selben Effekt hat wie zwei &&.
Aber jetzt zum eigentlichem Thema.
Bei Espers's Methode müsste er ziemlich viel Cut&Paste anwenden und es währe am schluss sogar noch mehr geschriebenes als bei derMethode von Nebulaz, wobei ich nicht ganz verstehe wieso du abfrägst ob der Stein vor jemanden liegt. Naja auf jeden Fall meine Idee hier zu währe:
|
|
Ruby Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class Interpreter alias_method(:stone_destroy_initialize, :initialize) alias_method(:stone_destroy_update, :update) def initialize() stone_destroy_initialize() @in_the_area = false end def update() stone_destroy_update() if Keys.press?(Keys::F) name = $game_map.events[@event_id].charachter_name if name == "stone" # "stone" should be the name of the event pic else change the name of the pic or the string px, py = $game_player.x, $game_player.y ex, ey = $game_map.events[@event_id].x, $game_map.events[@event_id].y distance = (px - ex + py - ey).abs() if distance == 1 @in_the_area = true end end end end end |
Über Main.
Jetzt musst du in jedem Event nur noch abfragen ob @in_the_area auf true steht um dann die animation von deinem Player in nem common event abzuspielen. Das ganze dann mit Parallelprocess.
Mehr als a Allgäuer ka a Mensch it wera.
Wie soll ich wissen was ich denke, bevor ich nicht höre was ich sage?
NES-Emulator - a simple NES-Emulator
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
zum Lesen den Text mit der Maus markieren
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Reborn« (11. September 2010, 14:35)
Hm. :/ Also das Script von Chaosgod funzt immernoch nicht. Weder mit Klammern noch mit && oder auch beidem. ^^ Es kommt immer ein Syntax Error. Hab jetz meine Methode beibehalten und nach Irrlichts Anweisung geändert. Klappt jetzt alles. 
Trotzdem würde ich noch gern wissen was an dem Script falsch ist bzw. warum es nicht geht, weil würde es gehen wär es ja sehr praktisch da es nicht so zeitaufwenig ist wie meine Variante. Man bedenke das im Spiel weit mehr als 1 Stein vorkommt ^^
Ich habe nochmal geschaut ob ich irgendwas falsch abgeschrieben habe, aber es ist alles korrekt. Das einzige was ich mich frage ist ob ich vielleicht die Variablen falsch eingetragen habe !?
Bei den Zeilen:
@ex = game_map.events[@event_id].x
@ey = game_map.events[@event_id].y
muss ich doch bei [@event_id] die nummer der variable eintragen oder nicht !? Also in meinem Fall hab ich es so geschrieben:
@ex = game_map.events[@30].x
@ey = game_map.events[@31].y
!? ^^

Trotzdem würde ich noch gern wissen was an dem Script falsch ist bzw. warum es nicht geht, weil würde es gehen wär es ja sehr praktisch da es nicht so zeitaufwenig ist wie meine Variante. Man bedenke das im Spiel weit mehr als 1 Stein vorkommt ^^
Ich habe nochmal geschaut ob ich irgendwas falsch abgeschrieben habe, aber es ist alles korrekt. Das einzige was ich mich frage ist ob ich vielleicht die Variablen falsch eingetragen habe !?
Bei den Zeilen:
@ex = game_map.events[@event_id].x
@ey = game_map.events[@event_id].y
muss ich doch bei [@event_id] die nummer der variable eintragen oder nicht !? Also in meinem Fall hab ich es so geschrieben:
@ex = game_map.events[@30].x
@ey = game_map.events[@31].y
!? ^^
@ex = $game_map.events[@event_id].x
@ey = $game_map.events[@event_id].y
Du hast das $ vor game_map vergessen,
zudem bezeichnet @event_id die ID des gerade abgehandelten Events:
willst du dort eine andere ID einsetzen kannst du auch eine andere Zahl dort hineinschreiben, in diesem Fall aber ohne @
Wenn du eine allgemeingültige Funktion brauchst die mit quasi 0 Anpassung auf beliebig vielen Maps mit beliebig vielen Felsen funktioniert kann ich dir nur zu Hindis Variante raten
@ey = $game_map.events[@event_id].y
Du hast das $ vor game_map vergessen,
zudem bezeichnet @event_id die ID des gerade abgehandelten Events:
willst du dort eine andere ID einsetzen kannst du auch eine andere Zahl dort hineinschreiben, in diesem Fall aber ohne @
Wenn du eine allgemeingültige Funktion brauchst die mit quasi 0 Anpassung auf beliebig vielen Maps mit beliebig vielen Felsen funktioniert kann ich dir nur zu Hindis Variante raten
Benutzerinformationen überspringen
Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.
Der Fehler tritt auf, wenn man das in einem Parallel Process macht.
Du musst das Event leicht umändern.
Page 1, Autorun: Switch irgendwas = ON
Page 2, Parallel Process: Irrlichts Code
Du musst das Event leicht umändern.
Page 1, Autorun: Switch irgendwas = ON
Page 2, Parallel Process: Irrlichts Code
Ähnliche Themen
-
Events & Technik »-
Wie mache ich zwei sachen bei einem Event(Action Button + Event Touch)
(13. Januar 2008, 15:34)
-
Events & Technik »-
Brauche Hilfe bei Battle -> Map un zurück
(30. August 2010, 13:38)
-
Maker-Talk »-
Fehler beim Starten des Rpg- Makers Xp.
(22. Januar 2009, 18:10)
-
Events & Technik »-
Hilfe bei Animationsevent in Map
(30. September 2006, 12:14)
-
Events & Technik »-
Events und schrift
(29. August 2006, 00:09)






