Dynamische Map-Effekte erstellen [Schleifen-Tutorial]

  • Hallo zusammen,

    heute würde ich euch gerne einen kleinen Trick zeigen, wie ihr euren Maps noch etwas mehr Leben einhauchen könnt! Dafür machen wir uns die Funktion der "Schleife" zu Nutze.


    Aber was genau ist eine Schleife?

    Nun - im Grunde genommen handelt es sich hierbei um eine Abfolge von Aktionen, welche am Ende ihres Ablaufes von vorne unbegrenzt häufig wiederholt werden.



    Unser Ziel:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Man erkennt, dass der Wettereffekt unabhängig davon angezeigt wird, ob man sich gerade in einem Gespräch befindet oder nicht. Das Gameplay wird also nicht davon beeinträchtigt, lediglich allgemein pausierende Funktionen (wie das Spielmenü) nehmen Einfluss auf unseren Effekt.
    Da es sich um ein "kurzes" Tutorial handelt, wurde der Sound nicht in mehreren Abstufungen in der Lautstärke angepasst, was aber neben anderen, später beschriebenen Ergänzungen nachträglich erprobt werden kann.



    Vorbereitung:

    Als Erstes erstellen wir ein neues Event! Ihr könnt jetzt entscheiden, ob dies übergreifend (für weniger spezifische Wetterlagen gut wieder verwertbar) oder auf einer bestimmten Karte mit stärkerer individuellen Note (beispielsweise für einzigartige Umgebungen) erstellt werden soll.


    • Für individuelle Maps:
      Das Event wird direkt auf der Map platziert, wo ihr den Effekt haben möchtet.
    • Übergreifend:
      Hierfür greifen wir auf ein "Common Event"/"Gewöhnliches Event" (je nach eingestellter Sprache eures Makers) zurück. Diese findet ihr in der Datenbank in einem eigenem Register.


    (Für individuelle Maps)
    Schritt 1:

    Öffnet euer Event und sucht auf der ersten Seite an Event-Befehlen nach dem Eintrag "Schleife" unten links im Befehls-Block.




    Nachdem ihr dies getan habt dürftet Ihr folgende Struktur in eurem Event-Code vorfinden.:




    Schritt 2:
    Nun haben wir bereits eine Grundlage und können nach Belieben verschiedene Funktionen einfügen! Für unser Beispiel greifen wir erst einmal auf die Funktion des "Screentone/Bildschirm tönen" zurück. Diesen finden wir auf der 2. Event-Befehle-Seite, rechts.




    Nachdem wir diesen Befehl ausgewählt haben, können wir nun aus einer kleinen Auswahl vor eingestellter Effekte zurückgreifen oder uns nach Herzenslust selbst mit den Farben austoben!



    Für unser Beispiel stellen wir folgende Werte ein:


    Dies bewirkt folgendes Verhalten:

    • Über eine Dauer von 180 Frames (~3 Sekunden) verdunkelt sich der Bildschirm etwas. Dies kann das Aufziehen von Wolken darstellen. Da das Häkchen bei "Warten auf Schluss" steht, wird der darauf folgende Event-Code erst gestartet, wenn das Überblenden des Bildschirmtones abgeschlossen wurde.



    Schritt 3:
    Um nun noch etwas mehr Abwechslung zu erzeugen, erstellen wir einen kleinen Regeneffekt, welcher aus den aufgezogenen Wolken resultieren soll. Dafür wählen wir aus der Event-Befehl-Übersicht folgenden Punkt der 2. Seite aus:



    Und werden nun von diesem Fenster begrüßt, welches wir wie folgt einstellen:

    Bild_7_Regen-Einstellungen.png


    Dies führt dazu, dass der ohnehin eher weniger stark einblendbare Regen ungefähr innerhalb von ~ 5 Sekunde auf das Einblenden der dunklen Wolken folgt und mit maximaler Stärke (welche bei den Standard-Effekten immer noch eher leicht ausfällt) startet.
    Hier verzichten wir auf die Option des Abwartens, bevor weiterer Event-Code ausgeführt werden soll. Dies hat den Grund, dass wir einen direkten Übergang hin zum darauf folgenden Effekt erzielen möchten.




    Schritt 4:
    Nachdem wir nun einen abgedunkelten Bildschirm und einen Regeneffekt haben, fehlt noch etwas sehr Wichtiges - der passende Sound! Also erstellen wir wieder einen neuen Event-Code, indem wir aus der bereits bekannten Auflistung auf Seite 2 folgenden Button betätigen:


    Dies führt uns zu folgendem Fenster, wo wir aus den mitgelieferten Sounds des RTPs (Run-Time-Package - das mitgelieferte Set an Grafiken, Sounds und Musik) den Sound "Rain2" mit folgenden Optionen auswählen.


    Diese Einstellungen sorgen dafür, dass der Sound nur bei 30% Lautstärke hörbar ist (was immer noch laut genug sein dürfte, da die vor eingestellten Lautstärkewerte im Maker eher zu laut, als zu leise sind).
    Zusätzlich könnte man jetzt noch die Tonhöhe und den Schwerpunkt der Richtung einstellen (links oder rechts), von wo der Sound zu hören ist. Für unsere Zwecke reicht es jedoch, wenn wir diese zusätzlichen Optionen unangetastet lassen.



    Schritt 5:
    Nun setzen wir einen simplen "Wait/Warten-Befehl von 960 Frames (~16 Sekunden), welcher die Dauer unserer bisherigen Einstellungen markiert.

      Bild_11_Warten_Befehl_Einstellungen.png



    Zwischenstand:
    Unser Event-Code sollte nun folgender maßen ausschauen:


    Wir haben nun bereits definiert, wie sich die Wolken zuziehen sollen, der Regen eingeblendet wird und ein (halbwegs) passender Sound startet. Dasselbe müssen wir jetzt noch für einen etwas klareren Himmel einstellen, um wirklich Gebrauch von den Funktionen der Schleife machen zu können!




    Schritt 6:
    Wir starten wieder mit dem Screentone/Bildschirmton - neben Sound & Musik dem (meiner Meinung nach) mächtigsten Werkzeug zur Erzeugung von Stimmung im Maker! Da wir nun bereits über eine Grundstruktur verfügen, können wir den Befehl aus unserer Struktur heraus kopieren und ganz unten, unterhalb des Warten/Wait-Befehles einfügen.
    Dieses Mal nutzen wir folgende Optionen, da ich persönlich die Standard-Einstellungen von 0 sehr "blank" und weniger stimmungsvoll finde.




    Schritt 7:
    Wir nähern uns dem Ende! Parallel zur bisherigen Struktur ist nun der Wettereffekt dran. Diesen Befehl können wir ebenfalls kopieren und unterhalb des letzten Event-Befehles einfügen. Hier ändern wir die Optionen nun wie folgt:

    Bild_14_Ende_des_Regens.png


    Schritt 8:
    Nun haben wir die Wahl, ob wir nach dem Regen einen subtilen, alternativen Sound abspielen möchten - beispielsweise leises Vogelzwischern, herabfallende Regentropfen von Blättern oder etwas ganz anderes. Da wir es in diesem Tutorial jedoch simpel halten möchten und die mitgelieferten Sounds verwenden, stellen wir in einem erneut kopierten Event-Code (erneut unten eingefügt) nun folgendes ein:



    Sind wir nun am Ziel angekommen? Nicht ganz! Wer es sich (mit dem richtigen Auslöser des Events) nicht nehmen lassen konnte, schon mal das Ganze in Aktion zu testen wird bemerken, dass der Übergang noch nicht so ganz hin haut. Das liegt daran, dass wir am Ende als letzten Befehl noch einmal ein "Wait/Warten" setzen müssen, da es sonst sofort wieder zu regnen beginnt.



    Endspurt:
    Unser Code sollte nun folgendermaßen ausschauen:




    Nun dürfen wir jedoch ein kleines Detail nicht vergessen, welches davon abhängt, welche Wahl wir zu Anfang getroffen haben. Wir kommen nochmal auf den Auslöser zu sprechen. Im obigen Bild kann man sehen, wie dieser bei normalen Events standardisiert auf "Aktionstaste" steht.
    Für Effekte, welche jedoch parallel zur Tasteneingabe des Spielers geschehen sollen, benötigen wir hier die Option: "Parallel".




    Nun sollte bei euch alles wie gewünscht funktionieren - ihr habt es geschafft! :]   


    ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

    Bonus: Alternatives Szenario - Common Event/Gewöhnliches Event:
    Solltet ihr den Code zu Anfang in einem übergreifenden Event gestartet haben, müsst ihr hier noch ein paar kleine Details beachten.

    • Der Übersicht halber sollten Events gerade hier einen prägnanten Namen erhalten.
    • Auch hier gilt es, den Auslöser auf "Parallel" einzustellen.
    • Zusätzlich muss ein Schalter definiert werden (am besten ebenfalls klar benennen), welchen ihr dann auf den verschiedensten Maps mit einem normalen Event aktivieren könnt. Der "ausgelagerte" Event-Code des "Common Event/Gewöhnlichen Event" wird dann auf den Maps ausgelöst, ohne dass man diesen kopieren müsste.
      Dies ist besonders ratsam bei komplexen Code, um diesen an einem Ort stets aktuell zu halten. Es gibt kaum etwas nervenaufreibenderes, als sich leichte Variationen desselben Codes an verschiedene Stellen seines Spieles zu kopieren und dann nach einer Weile nach den Unterschieden suchen zu müssen, damit alles miteinander harmoniert.
      Macht ausgiebig Gebrauch von der Stärke dieser Event-Klasse!




    Damit dieser Code nun auf den jeweiligen Maps auch aktiviert wird, sprechen wir den definierten Schalter (in diesem Falle Schalter #20 mit dem Namen "Schleife_Regenschauer" <- Event-Charakter + Beschreibung des Effektes) in einem sehr simplen Standard-Event direkt auf der Map an:

    Bild_20_Schalter_Einstellungen.png


    Außerdem fügen wir noch den Event-Befehl "Ereignisbearbeitung beenden/Erase Event" hinzu, da der Schalter nur ein einziges Mal aktiviert werden muss und das Event danach nicht mehr benötigt wird.




    Wir dürfen nun wieder nicht vergessen, den Auslöser auf "Parallel" zu setzen, dann sollte das Event auf der Map folgendermaßen ausschauen:




    Achtung! Der Schalter (in diesem Fall #20) bleibt nun solange aktiv, bis ihr ihn wieder deaktiviert!
    Wenn ihr also ein Gebäude, eine Höhle oder Ähnliches betretet, bzw. für eine Zwischensequenz gerade volle Kontrolle über Bildschirmton, Hintergrundsound und Wettereffekte benötigt, vergesst nicht auf die nun erlernte Art und Weise den Schalter bei einem Teleport-Event oder im Rahmen eures Zwischensequenz-Events wieder auf "AUS" zu stellen!

    Sobald dies geschieht, wird das Common Event/Gewöhnliche Event wieder inaktiv, bis ihr die Map erneut betretet oder auf einer anderen Map mit dem kopierten Trigger-Event Gebrauch davon machen möchtet.




    Ich hoffe euch konnte dieses "kleine" Beispiel dabei behilflich sein, euch an das Thema "Schleifen" heranzutasten. Das Ganze lässt sich auch für wesentlich komplexere Abläufe, wie verknüpfte Dialoge, Rätsel, Minispiele etc. anwenden, wozu dann auch "Labels" ein praktisches Werkzeug wären. Aber das wäre Futter für ein eigenes Tutorial. =)


    Viel Spaß beim Ausprobieren und variiert die Werte ruhig! Jeder wird da andere Vorlieben haben und vielleicht möchtet ihr das Ganze ja auch noch um folgende Beispiele erweitern:

    • Nebeleffekte
    • verschiedene Abstufungen der Intensität des Regens
    • zwischenzeitliche Schwankungen im Screentone bei "klarem Himmel", welche kleine Wolken vor der Sonne symbolisieren, welche schnell wieder verschwinden
    • zusätzliche SE (Sound-Effekte), welche in bestimmten Abständen abgespielt werden sollen - beispielsweise für einzelne Blitze
    • etc.


    Bei Fragen oder Anregungen könnt ihr hier gerne einen Kommentar hinterlassen! :]

    Meine Projekte:

    Hauptprojekt:Village Siege (Arbeitstitel)Tower-Defense Spiel mit kleinem TwistPrototyp: ~ 30%GDevelop
    Nebenprojekt:Misty Hollow: Makabere Abenteuer (Arbeitstitel)klassisches RPG mit einer Mischung aus Witz und GruselDemo: ~ 5%RPG Maker MZ
  • Guten Morgen~

    vielen Dank für das tolle Tutorial! Super verständlich und klar geschrieben.


    Ich würde vielleicht noch ein kleines Gif/Video ergänzen, damit man tatsächlich auch noch was für die Augen hat. Gerade als Anfänger können solche Wall of Texts Tutorials doch recht schnell überwältigend wirken und es wäre schade, wenn es daran scheitert, denn Schleifen sind so super nützlich.

  • So - eine Stunde später, und ein kurzes Video wurde wie vorgeschlagen hinzugefügt - danke für den Input! :]
    Das Mapping ist jetzt mehr zweckmäßig, da ich mit dem RTP nicht ganz warm werde und primär käufliche, andere Ressourcen verwende.

    Meine Projekte:

    Hauptprojekt:Village Siege (Arbeitstitel)Tower-Defense Spiel mit kleinem TwistPrototyp: ~ 30%GDevelop
    Nebenprojekt:Misty Hollow: Makabere Abenteuer (Arbeitstitel)klassisches RPG mit einer Mischung aus Witz und GruselDemo: ~ 5%RPG Maker MZ
  • Ähnlich wie Kojote habe ich an die Möglichkeit das Wetter einfach nur zeitabhängig zu wechseln noch gar nicht gedacht. Erinnert sehr an Open World Spiele und könnte so ja auch für einen Tag- & Nacht-Zirkel benutzt werden. Gerade, weil Tageszeit und Wetter bei uns auch für einige Fähigkeiten eine Rolle spielen ist das sehr interessant.


    Ich fand auch die Erinnerung sehr angebracht Common Events vielseitiger einzusetzen - ich habe viel zu spät angefangen überhaupt Common Events zu benutzen und habe mich immer noch nicht richtig daran gewöhnt. Stattdessen greife ich immer zuerst auf normale Events zurück und mache es mir unnötig schwer.


    Nachdem du es als Schleifen-Tutorial gekennzeichnet hast wäre es vielleicht noch ganz auf den Befehl "Schleife unterbrechen" einzugehen? Ich weiß noch, dass es mich am Anfang etwas verwirrt hat, wo und wie der richtig eingesetzt wird.


    Uuuund noch eine Frage: Wiederholt sich ein Paralleles Event nicht sowieso von selbst? In dem Fall wäre eine Schleife doch eigentlich überflüssig, oder verhält sich das bei Common Events mit Parallel als Auslöser anders?

  • Verhält sich hier ebenso, wie bei einem parallelen Event. Die Schleife kann gesetzt werden und bringt minimalen Vorteil gegenüber keiner Schleife.


    Bei älteren Makern hat die Schleife in einem parallelen Event den Vorteil gebracht, dass dieses häufiger geupdated wird. Bei den neueren Makern bringt es diesen Vorteil nicht mehr.

  • Coucassi
    Für mich tragen solche kleinen Umbrüche der Witterung immer sehr viel zur Glaubwürdigkeit der Spielwelt bei - gerade in Küstennähe oder im Gebirge. Aber natürlich lässt sich auch - wie von Dir bereits erwähnt - ganz gut ein Tag-Nacht-System mit individueller Licht- und Soundkulisse erstellen und noch weiter gefasst könnte man über solch ein Common Event auch diverse Schalter triggern, welche dann das Verhalten der NPCs in der Spieltwelt bestimmen (Läden geschlossen, innerhalb von Gebäuden in die Betten gehen, etc).
    Manchmal denke ich mir, dass man ab einem mittelgroßen Spiel schon fast jemanden alleine dafür an Bord holen könnte, all diese Details in die Spielwelt einzuweben, damit sie mehr "atmet". :D

    Ich kann das Tutorial die Tage nochmal um den Punkt der Schleifen-Unterbrechung erweitern - danke für den Input!

    FlipelyFlip
    Danke für die Ergänzung! Tatsächlich war ich im Ursprung von der ersten Technik-Spielerei so begeistert, dass ich mir dachte: "Ist für Einsteiger sicherlich 'ne nette Geschichte!" Der Weg dort hin ist ja oftmals mehrgleisig möglich - ich lerne da auch noch einiges dazu. Künftig werde ich mir das mit der Schleife in diesem Kontext dann vielleicht sogar sparen. Ehrlicher Weise muss ich mich in den Maker nochmal komplett neu einfinden.

    Meine Projekte:

    Hauptprojekt:Village Siege (Arbeitstitel)Tower-Defense Spiel mit kleinem TwistPrototyp: ~ 30%GDevelop
    Nebenprojekt:Misty Hollow: Makabere Abenteuer (Arbeitstitel)klassisches RPG mit einer Mischung aus Witz und GruselDemo: ~ 5%RPG Maker MZ
  • Coucassi Schleife in einem parallelen Prozess hat einen kleinen Vorteil, nämlich die Geschwindigkeit. Eine Schleife in einem parallelen Prozess ist immer schneller als rein ein paralleler Prozess. Schau dir mal meine letzten beiden Video-Tutorials an. Im Datensammler nutze ich das immer gern.


    Common Events (CE) nutze ich auch bei Forgotten Foe erst so richtig. Vorher nur sporadisch für Kleinigkeiten bin ich jetzt richtig auf den Geschmack gekommen. Man muss manchmal etwas umdenken, aber prinzipiell hat ein CE einige Vorteile. Größter Vorteil dürfte ja allein schon sein, dass die Events überall erreichbar sind. Gerade im Bezug auf den Datensammler. Ich brauche sowieso den Datensammler fast auf jeder Map. Einmal eingeschalten läuft der Datensammler dauerhaft im Hintergrund so fern man mit Save-Variablen und Save-Schaltern arbeitet.


    ChimaereJade Geht mir ähnlich, der Umstieg vom MV zu MZ macht mir keine Probleme, außer beim Mapping. Hier muss man ganz schön umdenken. Ist aber finde ich nen schöneres Mapping. :grinsenderork:

  • Kojote nein, ist es nicht mehr. Wie gesagt, in den älteren Makern (bis VX Ace) war es tatsächlich schneller als nur ein Parallel Process aber inzwischen bringt dir die Schleife in einem parallelen Process nichts mehr extra Performance. Es ist inzwischen mehr Placebo-Effekt den viele versprüren, als dass es tatsächlich der Fall ist.

  • Was mich bei dem Thema gerade interessieren würde - wie schaut es denn bei Performance-Problemen aus?

    In anderen Engines, wie Godot oder GDevelop kam ich mit der "Delta Time" in Berührung. Diese dient dazu, hardwareunabhängig bestimmte Taktungen der Abläufe (durch reale Sekunden, nicht durch Frames) aufrecht zu erhalten, damit das grundsätzliche Spielerlebnis (bei komplexen Abläufen) auf jedem Gerät möglichst gleich ausfällt.

    Könnte in solch einer Situation die Priorisierung durch Schleifen gegenüber allgemeinem Event-Code in einem parallelen Prozess doch noch einen Unterschied ausmachen, wenn die Performance gerade etwas ins Stocken gerät?
    Also beispielsweise wenn zwei getrennte Events gleichzeitig aktiv sind - eines mit Schleife und eines als normaler, paralleler Prozess?

    Das sollte (mit größeren Performance-Schluckaufs) natürlich nur selten vorkommen, aber würde diese Schleife vielleicht legitimieren. :hmm:

    Meine Projekte:

    Hauptprojekt:Village Siege (Arbeitstitel)Tower-Defense Spiel mit kleinem TwistPrototyp: ~ 30%GDevelop
    Nebenprojekt:Misty Hollow: Makabere Abenteuer (Arbeitstitel)klassisches RPG mit einer Mischung aus Witz und GruselDemo: ~ 5%RPG Maker MZ
  • Also so lange du bei einer Schleife immer brav 1 Frame Wartezeit einbaust, passiert schon mal da kein Problem. Es gibt seit dem VXAce da einen Bug. Wenn du kein Frame Wartezeit einbaust, fängt es nach ein paar Sekunden an zu laggen. Prinzipiell baue ich auch so wenig Schleifen wie möglich ein und diese sind auch immer recht klein.


    VXAce


    Den VXAce habe ich bisher als einzigen Maker zum weinen gebracht. Der hat durch komplexe und viele parallele Prozesse schon gern mal angefangen Probleme zu bereiten. Die konnte ich zwar lösen, aber halt nur durch starke Abstriche.


    MV


    Beim MV hatte ich fast nie Performanceprobleme und wenn konnte ich diese immer durch etwas Kreativität umgehen. Zum Beispiel gibt es da die Bergsturzkarte. In dieser Map arbeiten 50 Events mit parallelen Prozessen. Da gab es zwar im eigentlichen Sinne keine Laggs, aber hier und da sind Events zu spät gestartet oder X-Y-Vergleiche wuren zu spät ausgeführt. Ich habe dann die Karte "halbiert". Bedeutet, ungefähr in der Mitte der Karte gibt es einen Schalter der die linken 25 Prozesse deaktiviert und rechts aktiviert oder halt umgekehrt rechts aktiviert und links deaktiviert. Problem gelöst.


    MZ


    Kann ich noch nicht viel sagen. Rein von den Plugins und was mir diese "tolle" Performanceanzeige sagt, bin ich sehr gut im rennen. Der MZ scheint mehr Puste zu haben.



    Man muss zur Verteidigung der Maker aber auch sagen, dass ich durch Minispiele und Co. den Maker relativ viel abverlange. Von Performanceprobleme hatte ich bei den Makern noch nie Alpträume. Eher halt mit Begrenzung des Makers an sich. Ich vermisse im Maker viele Funktionen die ich in Unity oder besser gesagt beim Programmieren habe. Das fängt schon mit Kleinigkeiten wie Variablennamen, Methodennamen mit Parameterübergabe und solche Späße.

  • Naja das ist recht einfach. :grinsenderork:


    Du hast einen Stein, dieser rollt mit einer Bewergungsroute in einem prallelen Prozess nach unten. Ist er unten angekommen, wird mit 'Ereignisposition festlegen' der Stein wieder auf den Berg geholt, wartet kurz damit die Steine zu unterschiedlichen Zeiten rollen und dann beginnt alles wieder von vorn. Da es 50 Steine sind, musst du halt 50 parallele Prozesse haben.


    Könnte man es mit 'automer Bewegung' machen? Nein, da es dort kein 'Eregnisstandort festlegen' gibt. Der Stein müsste also mit Bewegungsrouten auf den Berg geholt werden. Das macht das Gefühl der Lawine zu nichte, da es Pausen geben würde. Zumal muss man dann auch unterscheiden, ob der Fels nach unten rollt oder auf dem Weg nach oben ist. Würde wieder zu nem Abfragechaos führen, da ansonsten der Spieler von einem unsichtbaren Stein auf dem Weg nach oben gekickt würde.


    Könnte man es in einem einzigen parallelen Prozess machen? Nein, da die Steine immer zu unterschiedlichen Zeiten herumrollen sollen und das in einem Prozess zu nem Abfragechaos führen würde. Zweites Problem ist, dass es Ungenauigkeiten mit der X-Y-Abfrage gibt. Der Spieler wird nicht getroffen oder wird getroffen, obwohl der Stein noch weit entfernt ist oder schon vorbei ist. Ziemlich unschön.^^


    Deswegen wird ungefähr in der Mitte umgeschalten. Erst sind die ersten 25 Steine aktiv, dann die zweiten 25 Steine. :zwinkernderork:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!