Posts by Rekit

    Ich nominiere daher direkt mal noch ein paar Bilder:

    Der Kreis des Morgengrauens Ebene von Teiko

    Ebene von Teiko von Orange4 aus der Bildergalerie


    9722

    Screenshot aus Bastion of Shadows von schadowdong aus dem Spielethread von Bastion of Shadows - Vollversion


    ME_Screen_Sammlung.png

    Das bild unten rechts von "ein paar Bilder" von Hotzenplotz aus dem Spielethread von Meeresrauschen - Vollversion

    9760

    "Pheratom" von Yahyahbp aus dem Spielethread Mein Spielprojekt - Depth of Space


    9753-6c9343411d6304b59406b144c3a7dae74500fe0d3d04df48a20996c54953641f-variant.webp

    Was hat KR1 da wieder angestellt von Jitsu Koan aus dem Spielethread von Dampftraum

    @Pixel_Gaming bitte halte dich auch an Zions Aussage, die Diskussion einzustellen/den Ton freundlicher zu halten.

    Abgesehen davon möchte ich alle auch einmal anhalten, bitte nicht zwischen den Zeilen Aussagen herauszulesen, die nicht geschrieben worden sind und die Energie lieber dazu aufwenden, noch ein paar Bilder für den April zu nominieren.

    Ich habe heute mal ein bisschen in meiner Ressourcen-kiste aufgeräumt und einige ältere Charactersprites auch mal nach Itch.io verschoben.

    Und ein älteres Pack hat ein Update erhalten, da mittlerweile ein paar Dinge dazu gekommen sind.

    Neu eingestellte Packs:


    Update auf Packs :


    Seit dem letzten Post hier ist ja schon etwas Zeit vergangen, also kann es sein, dass seitdem grundsätzlich schon ein paar neue Sachen dazugekommen sind... also lohnt sich eventuell grundsätzlich ein Blick auf die einzelnen Collections, wenn ihr nicht über Itch.io sowieso schon schaut :)

    Ich habe hier auch zwei verschiedene Spiele, die ich wirklich cool finde:

    Sparen Sie 60% bei Beacon Pines auf Steam

    Ein Adventure "Spielbuch" über ein großes Geheimnis. Für alle, die Visual Novels mögen oder kein Problem mit viel Text haben.

    Iris and the Giant bei Steam

    eine Art Deckbuilder "ähnlich" wie Slay the Spire mit coolem eigenen Stil. Spielt es aber lieber mit Maus und Tastatur, denn bei der Controllersteuerung gab es bei mir öfter merkwürdige Glitches.

    Grundsätzlich würde ich dafür plädieren, das zu nehmen, was dir am Besten gefällt.

    Andererseits hast du natürlich mit deinem Menü etwas, was einzigartiger ist, als die Plugin-lösung von Yanfly. Brauchst du denn mehr Details oder ist mit deiner Lösung eigentlich schon alles Wichtige dargestellt?

    (Ich persönlich mag es lieber, wenn Spiele ihren eigenen Charakter haben und der Touch mit dem Charakter im Craftingmenü gefällt mir auch besser als Yanflys Lösung "von der Stange", aber am Wichtigsten ist hier, womit du dich gut fühlst)

    Wenn du kein Jurist bist, ist dies nur eine weitere Interpretation von vielen, die keinerlei Bestand, solange sie nicht von einem Gericht betätigt wurde. Deine Interpretation kann zutreffen, muss aber nicht. Ich finde es schwierig, mit nicht fachlichem Wissen zu argumentieren. Solltest du hingegen Jurist sein, nehm ich meine Aussage zurück, auch wenn es sicherlich auch im Fachbereich selbst unterschiedliche Ansichten geben dürfte.

    Man muss kein Jurist sein, um EULAS zu lesen und zu verstehen - im Gegenteil sind sie extra so formuliert, dass Endnutzer dadurch entnehmen können, was erlaubt ist und was nicht. Ich halte ja auch niemanden davon auf, RTP in generative AI zu laden (kann ich ja auch gar nicht). Ich finde es aber schade, dass du meine "Interpretation" (ganz ehrlich, es gibt da nicht so viel zu interpretieren) so zur Seite wischst. Genauso kann ich ja jetzt sagen "du bist selbst kein Jurist, woher willst du denn wissen, ob das relevant ist oder nicht".

    Bei der Bearbeitung von selbst geladenen Bildern kann gegebenenfalls trotzdem übrigens das Urheberrecht gelten und man kann sich hier eine Klage einholen sofern es nicht genug verfremdet wurde (und hier lasse ich mal einen Link von einem Juristen da, damit meine Aussage auch als legitim angesehen wird.. https://ggr-law.com/urheberrecht/f…errecht/#c19154 )

    Rekit

    Der RPG Maker Eula Absatz hat hier denke ich keine wirkliche Bedeutung, denn AI Generatoren sind wie Paint einfach eine Grafiksoftware. Ist das editieren mit Paint nun illegal.
    Man kann einfach nur abwarten bis das juristisch richtig aufgearbeitet wurde und wirklich klare Gesetze dazu bestehen. Bis dahin sind eigentlich jegliche Auslegungen was jetzt richtig oder falsch ist nicht viel wert.

    Ein KI-Tool wie generative AI ist insofern NICHT wie Paint eine Grafiksoftware, da alle In die AI eingespeisten Kunstwerke nicht nur für dich, sondern auch für andere Dritte "zugänglich" sind. Strafbar ist in dem Fall sicherlich nicht jemand, der sich dann RTP-ähnliche Artworks erstellen lässt, aber DU persönlich, der dieses Copyrightgeschützte Stück Arbeit eingespeist hast, verstößst gegen die EULA vom RPGmaker. Das ist nur dann nicht relevant, wenn du deine eigene generative KI hast, in deinem eigenen Umfeld und sichergehen kannst, dass darauf nur Leute Zugriff haben, die auch eine Lizenz haben.

    Du bist nicht wirklich eingeschränkt, kommt halt drauf an was genau du machen willst. Du kannst der AI einfach ein Bild von zb RTP Facesets geben und sagen das es diese Facesets im Stile von Ghibli umgestalten soll. Dann hast du die RTP Faces im Ghiblistil.

    Gerade den Ghibli-Stil hier anzuführen stößt mir etwas bitter auf, da gerade Ghibli sich sehr offen gegen AI-Art positioniert hat und es nicht unterstützt. Ansonsten will ich zu diesem Thema eigentlich auch nicht wirklich viel beitragen außer bei diesem einen Punkt.

    Ich zitiere hier einfach mal die RPGmaker-EULA:

    Quote

    Article 2 (Handling of Company Assets)

    The User shall handle Company Assets contained in This Software as follows.

    (1) Company Assets may be used only in User Games produced with This Software.

    (2) Company Assets may be modified (colors or size changed, inverted, trimmed, etc.) only for purposes of use in User Games produced with This Software.

    (3) Company Assets or those modified pursuant to the previous item may undergo Distribution, etc. with User Games produced with This Software. Furthermore, the User may not perform Distribution, etc. of individual Company Assets or those modified, or Distribution, etc. in combination with programs, etc. other than User Games. However, the User may duplicate, transfer, publicly transmit, or enable transmission of personally-modified Company Assets to other Authorized Users free of charge.


    Lädt man die RPGmaker-Assets in eine generative AI, sorgt man direkt dafür, dass diese auch an User weitergegeben werden, die keine Lizenzen für den RPGmaker haben. Das verstößt, so wie ich das lese, gegen die RPGmaker Nutzungsbedingungen.

    Heute sind wir am letzten Türchen angekommen, ab morgen sagen wir Lebe Wohl zum Adventskalender.

    Und wie kann man besser gehen als mit einem Knall?

    Um auch eure Spiele mit einem tüchtigen Schuss Spielspaß zu versorgen, hat Sevarihk für euch dieses coolen UI-Elemente beigetragen!

    Ob ihr einen Shooter bauen wollt oder einfach nur launige Minispiele, diese coolen Grafiken peppen jedes User-Interface auf!





    UI assets.zip
    flag_ger Nutzungsbedingungen
    Du darfst:
    - die Ressourcen in dieser Sammlung in nicht-kommerziellen oder kommerziellen Projekten verwenden - die Ressourcen nach Herzenslust editieren, einfärben und mit anderen Ressourcen kombinieren
    Aber: - du musst mich in den Credits als "Sevarihk" als Ersteller der Ressourcen angeben - du darfst die Ressourcen nicht als deine eigenen ausgeben - du darfst die Ressourcen weiterverbreiten, aber nur solange du die zwei vorherigen Punkte einhältst UND einen Link zu meiner Homepage (https://aurora-sprites.wixsite.com/main) oder einer anderen Seite, auf der ich die Ressourcen selbst zur Verfügung gestellt habe, anführst. - ich würde mich über eine Kopie freuen, wenn du ein Projekt veröffentlichst, das meine Ressourcen beinhaltet

    flag_eng Terms of Use
    You are allowed to:
    - use all of the assets in this collection in non-commercial or commercial projects - edit, recolour and combine with other assets to your heart's content
    But:
    - you must credit me as "Sevarihk" - you must not present them as your own assets - you may only share my assets if you explicitly credit me AND provide a link to either my homepage or another source by me (my forum threads/discord server/Deviantart gallery/ etc.). - if you finish a project that includes any of my assets, I would appreciate a free copy


    Und damit möchte ich mich nochmal für all die schönen verschiedenen Abgaben bedanken und euch Frohe Feiertage und schöne freie Tage wünschen <3

    So kurz vorm Ende es Kalenders trifft eine weitere Orktruppe dazu!

    der ein oder andere aufmerksame Forenbeobachter hat vielleicht schon diesen Kollegen im Forum gesehen:

    Und auf seiner Wanderschaft im Zuge des 8-Ork-Jams hat er es auch mit seiner Begleiterin in unseren Adventskalender geschafft.

    Danke an Rasak-kun für diese coole Abgabe! ^^










    flag_ger Nutzungsbedingungen
    Meine Grafiken dürfen frei in kommerziellen und nicht-kommerziellen Projekten verwendet und für diese bearbeitet werden, solange ich, Rasak, die Credits für meine Grafiken erhalte.
    Es ist nicht erlaubt, meine Grafiken zu verbreiten oder zu verkaufen, aber ihr könnt meine Itch.io-Seite verlinken.
    Ich freue mich immer meine Grafiken in Einsatz zu sehen, es würde mich also freuen wenn ihr mich auf euer Spiel aufmerksam macht :3

    flag_eng Terms of Use

    Can be used in commercial and non-commercial projects and also altered as long as I , Rasak, get credited accordingly.
    It's not allowed to distribute or sell my graphics, but you can linkmy itch.io-site .
    I'm always happy to see my ressources in use, so do tell if you use them in your projects :3

    So langsam nähern wir uns dem Ende des Kalenders und ich spüre schon, wie es wärmer wird...

    oder ist das überhaupt das Ende des Kalenders? Oder ist das etwa die Lava, die aus Ben s Abgabe fließt?!

    Auf alle Fälle gibt es diesmal neue coole Edits von Ben , diesmal fast too hot to handle!

    (bitte beim Mappen mit den heißen Teilen die SIcherheitshinweise beachten, gegebenenfalls Handschuhe tragen )





    flag_ger Nutzungsbedingungen

    - Free to use for everything (gemäß dem was FSM dazu sagt laut eigener HP, dh für kommerzielle Sachen lieber nochmal persönlich nachschauen / abklären).
    - Editieren und weiterverteilen ausdrücklich erlaubt und erwünscht!
    - Credits gehen immer an Refmap /FSM
    - Gerne für "14-hut-inside auch Credit User "Ben" geben (also mir :D)
    vor allem würde ich mich aber ultra freuen zu sehen, was damit gemacht wird.


    flag_eng Terms of Use

    - free to use for everything ( see FSMs own homepage, for commercial use you better look it up yourself / ask)
    - free to edit and share
    - credits to Refmap /FSM
    - credit "Ben" aswell
    show me what you made with it!

    Es knackt und dampft im heutigen Türchen!

    Denn Rasak-kun hat dieses mal für euch eine bunte Auswahl an Zahnrädern und Charaktern mitgebracht,

    perfekt, um eure Steampunk-welt zu bevölkern - oder das Labor eines geheimen Uhrenmachers zu verteidigen?








    flag_ger Nutzungsbedingungen

    Meine Grafiken dürfen frei in kommerziellen und nicht-kommerziellen Projekten verwendet und für diese bearbeitet werden, solange ich, Rasak, die Credits für meine Grafiken erhalte.
    Es ist nicht erlaubt, meine Grafiken zu verbreiten oder zu verkaufen, aber ihr könnt meine Itch.io-Seite verlinken.
    Ich freue mich immer meine Grafiken in Einsatz zu sehen, es würde mich also freuen wenn ihr mich auf euer Spiel aufmerksam macht :

    flag_eng Terms of Use

    Can be used in commercial and non-commercial projects and also altered as long as I , Rasak, get credited accordingly.
    It's not allowed to distribute or sell my graphics, but you can linkmy itch.io-site .
    I'm always happy to see my ressources in use, so do tell if you use them in your projects :3

    Heute geht es tief hinab - oder hoch hinaus, je nachdem von wo man es betrachtet ^^

    Denn schadowdong teilt heute mit euch diese coolen Aufzüge und Seilbahnen!

    Egal, ob ihr Säcke oder eure Heldentruppe in die unterste Ebene transportieren müsst oder einfach nur auf die andere Seite der Schlucht wollt, jetzt habt ihr die Mittel dazu!

    Und einen Screen direkt aus dem Projekt Dragon Birth gibt es auch dazu, damit ihr euch einen Eindruck davon machen könnt, wie die Grafiken im Einsatz aussehen:





    flag_ger Nutzungsbedingungen

    Die Grafiken dürfen frei in RPGmaker-engines verwendet werden, teilen ist auch erlaubt, sowie auch das Bearbeiten.
    Da es sich um Edits vom RTP vom RPGMaker MV&MZ handelt, müsst ihr zur Nutzung den entsprechenden Maker besitzen.

    Credits an Schadowdong wären schön.


    flag_eng Terms of Use
    The Graphics are free to use in RPGmaker-engines, sharing and editing is allowed

    Since the Ressources are edits of RTP you need to own RPGmaker MV&MZ to use them.

    Credits to Schadowdong are appreciated,

    RPGmaker-freunde aufgepasst! Habt ihr zwar den Rpgmaker MV und den MZ, arbeitet aber eigentlich lieber mit dem MV?

    Und wollt ihr nicht immer den MZ öffnen, um dessen Charaktergenerator zu nutzen? Dann hat Ariyana heute für euch eine coole Überraschung mitgebracht!

    Und zwar hat sie für euch Templates erstellt, mit denen ihr im MV Charaktere (Sprites) mit den MZ- Gesichtszügen erstellen könnt!

    Das seht ihr einmal beispielhaft an diesen Figuren:

       




    Templates.zip
    flag_ger Nutzungsbedingungen
    - Ihr müsst sowohl den RMMV als auch den RMMZ besitzen, um die Templates legal in RPG Maker Produkten verwenden zu dürfen!
    - Frei für kommerzielle und nicht-kommerzielle Nutzung, ABER keine Verwendung in pornografischen, x-rated oder obszönen Spielen und auch nicht in NFTs!
    - Credits gehen an Kadokawa/Gotcha Gotcha Games und mich (Ariyana)
    - Reposts der Templates sind erlaubt
    - Edits sind erlaubt, aber kein Posten der Edits ohne meine Erlaubnis!


    flag_eng Terms of Use
    - You need to own both RMMV and RMMZ to use the templates legally in RPGmaker products!
    - free for commercial and non commercial BUT no pornographic, x-rated or obscene game usage - also not allowed for NFTs!
    - Credits to Kadokawa/Gotcha Gotcha Games and Ariyana
    - Repost of the templates is allowed
    - editing is allowed, posting of edits only with permission

    Nun hatten wir einige Bauernhoftiere im letzten und in diesem Adventskalender.

    Da man sie leider nicht mit zu sich ins Haus nehmen kann,

    brauchen sie einen eigenen Ort, wo sie bleiben können.

    Und was wäre da besser geeignet als eine Scheune?

    Und damit wir hinter ihnen zumachen können,

    gibt es zusätzlich dazu auch noch ein Scheunentor :)








    flag_ger Nutzungsbestimmungen

    - frei für nicht-kommerzielle Spiele & kommerzielle Spiele
    - darf in jeder Game-Engine verwendet werden, ist aber optimiert auf den RPG Maker MZ [24x24]
    - Credits an Mijani/Rekit (eventuelle zusätzliche Credits werden bei den Tiles ensprechend erwähnt)
    - Edits der Tiles für eigene Zwecke erlaubt, Posten von Edits meiner Tiles mit Backlink auf meine itch-Seite und entsprechenden Credits erlaubt
    - kein Repost der Ressourcen auf anderen Plattformen (Ausnahme eure eigenen Edits, sieht Punkt davor)
    - kein Verkauf der originalen Grafiken oder Edits!


    flag_eng Terms of Use

    -free for non-commercial games & commercial games
    - free to use in any game engine, but optimized for RPG Maker MZ [24x24]
    - Credits to Mijani/Rekit (additional credits on specific pieces if needed)
    - editing tiles for personal usage allowed, also reposting your edits is allowed when you backlink to my itch.io site and credit me accordingly
    - don't repost the original unedited Tiles !
    - don't sell original unedited tiles OR edited tiles!


    Heute gibt es ein cooles Godot-4-Tutorial von Grandro !

    Und damit ihr dem Tutorial gut folgen könnt oder wenn ihr generell Fragen zum Aufbau dazu habt, hat er auch ein Beispielprojekt beigelegt:

    Audio_Manager_Tutorial.zip

    ❄️❄️❄️EINLEITUNG❄️❄️❄️

    Kennt ihr das Problem? Ihr habt Unmengen an Audio-Dateien angehäuft die ihr in eurem Spiel verwenden wollt,

    aber sie liegen einfach nur unordentlich herum?

    Ihr wollt sie dem Spieler alle zeigen, aber ihr habt einfach

    nicht genug Hände und auch nicht genug Zeit das Audio selber zu managen?

    Es fehlen auch die geldlichen

    Mittel für jeden Spieler einen ausgebildeten persönlichen Manager einzustellen?

    Abhilfe schaffen kann nur eines: Ein Audio Manager, der sich zwar nicht persönlich um den Spieler kümmern kann,

    aber ihm trotzdem immer genau das Audio um die Ohren bläst, das er gerade braucht.

    Es wird Zeit in vielen lustigen Farben Text in eine Datei zu hämmern.

    ❄️❄️❄️ZIELE❄️❄️❄️

    Wir unterteilen Audio in BGM (Background Music), SFX (Sound Effects) und BGS (Background Sounds).

    Nun möchten wir im Spiel für jede Kategorie Audio abspielen und auch pausieren können.

    Gleichzeitig wollen wir auch bei einem Mapwechsel Musik der vorherigen Map durch die der neuen ersetzen.

    ❄️❄️❄️SETUP❄️❄️❄️

    Wir erstellen für jede Audio-Kategorie einen Audio-Bus.

    Dadurch können wir für jede Kategorie

    individuell die Lautstärke ändern und Audio-Effekte hinzufügen.

    Die Funktionen der Audio-Busse ist nicht Teil

    dieses Tutorials, daher ist es nur wichtig zu wissen, dass es für jede Kategorie einen eigenen Bus gibt.

    ❄️❄️Audio_Manager❄️❄️

    ❄️Szenen Layout❄️

    Wir erstellen eine neue Szene mit einem `Node` und nennen es "Audio_Manager". Nun fügen wir 3 `Nodes`

    als Kinder hinzu und nennen sie "BGM", "SFX" und "BGS". Wir fügen diese Szene als Singleton (AutoLoad) in den

    Projekteinstellungen hinzu. Dadurch können wir von überall auf Audio_Manager zugreifen. Das ist sinnvoll,

    da man Audio-Wiedergabe an vielen Stellen eines Spiels braucht. Nun fügen wir dem Audio_Manager `Node` ein Skript

    hinzu.

    In diesem Skript erhält der Audio_Manager eine Referenz zu diesen 3 `Node` Kindern:

    Code
    @onready var _a_BGM = get_node("BGM")
    @onready var _a_SFX = get_node("SFX")
    @onready var _a_BGS = get_node("BGS")

    Wir werden später per Code diesen Kindern jeweils `AudioStreamPlayer` als Kinder hinzufügen. Diese `AudioStreamPlayer`

    spielen dann die Audio-Dateien für die jeweilige Kategorie ab. Während dem Playtest können wir so auch

    im Remote Scene Tree gut strukturiert sehen, in welcher Kategorie gerade welches Audio abgespielt wird.

    ❄️❄️Pauseable_Audio❄️❄️

    `AudioStreamPlayer` können pausiert werden, wodurch deren Audio-Wiedergabe pausiert wird. Hierfür gibt es

    bei `AudioStreamPlayer` die boolean Eigenschaft `paused`. Wenn man durch Pause-Funktion von Godot allerdings

    das Spiel pausiert und später wieder unpausiert, wird auch immer der `AudioStreamPlayer` unpausiert.

    Dadurch geht verloren, ob der `AudioStreamPlayer´ vor dem Pausieren des Spiels pausiert war:

    AudioStreamPlayer changes stream_paused internally · Issue #65743 · godotengine/godot
    Godot version 3.5.stable System information Windows 10 Issue description AudioStreamPlayer changes the stream_paused property internally when…
    github.com

    Um dieses Problem zu lösen, habe ich eine eigene Szene angefertigt, welche den `AudioStreamPlayer` erweitert.

    Sie hat eine weitere Eigenschaft `_a_stream_paused` welche repräsentiert, ob der `AudioStreamPlayer´ unabhängig

    von dem Pause-Status von Godot gerade pausiert ist. Nun verwenden wir im Audio_Manager stattdessen diese Szene.

    Der Code hierfür ist ziemlich uninteressant, wodurch ich nicht extra auf ihn eingehe.

    ❄️❄️❄️Audio_Manager❄️❄️❄️

    Da wir nun mit dem Setup fertig sind, können wir anfangen am Audio_Manager selber zu schreiben.

    Doch bevor wir uns den Code genauer angucken, sollte ich auf ein paar konzeptionelle Dinge eingehen.

    ❄️❄️Konzepte❄️❄️

    ❄️Ordnung❄️

    Wenn wir SFX und BGS abspielen brauchen wir keine Ordnung. Das ganze Audio wird einfach simultan abgespielt.

    Falls wir Momente im Spiel haben, bei denen zuviel SFX simultan abgespielt wird, können wir bei dem SFX Audio-Bus

    einen `HardLimiter` Audio-Effekt hinzufügen, mit welchem wir die maximale Lautstärke des Busses deckeln können.

    Bei BGS sollten wir selber sicherstellen können, dass nicht zuviel auf einmal abgespielt wird.

    Anders ist es allerdings bei BGM. Hier könnten wir auf Unmut stoßen, wenn sich der Spieler mehrere Lieder

    auf einmal anhören muss.

    Man könnte nun überlegen festzulegen, dass es immer genau einen `AudioStreamPlayer` gibt.

    Es gibt allerdings Fälle, bei denen es sinnvoll wäre sich das vorherige Lied zu merken, während man ein neues Lied

    abspielt. Ein Beispiel wäre bei einem Minispiel, welches seine eigene Musik hat. Nachdem man das Minispiel beendet hat,

    wäre es natürlich super das vorherige Lied wieder nahtlos abspielen zu können. Und was wäre, wenn es in dem Minispiel

    wiederum ein weiteres Minispiel gäbe?

    Als Programmierer müssen wir uns nun eine Datenstruktur überlegen, die in der Lage ist, dieses Verhalten zu repräsentieren.

    Wir wollen uns bei einem neuen Lied alte Lieder merken, und das vorherige Lied pausieren. Wenn wir das neue Lied dann wieder

    entfernen, wollen wir, dass das vorherige Lied dort weiterläuft, wo es pausiert wurde.

    Ihr könnt kurz nachdenklich in die Wolken blicken, falls ihr selber eine Idee habt.

    Eine bekannte Datenstruktur, die dieses Verhalten perfekt repräsentieren kann, ist der Stack. Ihr könnt euch das allgemeine

    Verhalten des Stacks wie ein Stapel Papier vorstellen: Wenn wir auf den Stapel gucken, sehen wir immer nur das oberste Blatt.

    Wir können aber nur ein Blatt Papier drauflegen, oder das oberste Blatt entfernen. Auf die anderen Blätter haben wir keinen direkten

    Zugriff.

    So macht es auch der Audio_Manager mit dem BGM Audio.

    Nur werden hier keine Blätter gestapelt, sondern Musik.

    Wenn wir `AudioStreamPlayer` als Kinder des Nodes BGM hinzufügen, wird dieser Stack durch die Reihenfolge der Kinder ausgedrückt:

    Das unterste Kind im SceneTree ist das oberste Lied auf dem Stack, da es das letzte Kind ist, welches hinzugefügt wurde.

    ❄️Zugriff❄️

    Während der Audio_Manager dann Audio managed, brauchen wir eine Möglichkeit einen bestimmten `AudioStreamPlayer` zu referenzieren.

    Ansonsten könnten wir unser Audio nicht pausieren oder andere Eigenschaften ändern, wie Pitch oder Lautstärke. Über den SceneTree

    können wir zwar jeweils die Kinder von BGM, SFX und BGS per Index referenzieren, allerdings wissen wir nicht, welcher Index zu welcher

    Sound-Datei gehört. Wir wollen über den Dateinamen einer Audio-Datei Zugriff auf den `AudioStreamPlayer` haben, welcher diese

    Audio-Datei abspielt. Dies lösen wir über ein `Dictionary` das Dateinamen zu einem Array aus `AudioStreamPlayer` matched. Das Array

    ist notwendig, da eine Sound-Datei theoretisch mehrmals gleichzeitig abgespielt werden kann und es daher auch mehrere

    `AudioStreamPlayer` geben kann, die sie abspielt.

    ❄️❄️Code❄️❄️

    Schauen wir uns nun also den Code an, der diese Funktionalitäten implementiert.

    ❄️BGM abspielen❄️

    Code
    func play_bgm(p_stream, p_volume = 1.0, p_pitch = 1.0, p_from = 0.0):
    var player = _instance_player_bgm(p_stream, p_volume, p_pitch)
    _set_last_bgm_stream_paused(true)
    player.play.call_deferred(p_from)
    
    
    _a_BGM.add_child(player)
    
    
    return player

    Diese Methode ist dafür zuständig, ein neues BGM Audio abzuspielen. Hierfür wird ein neuer `AudioStreamPlayer` auf den Stack gelegt.

    1. Wenn wir BGM abspielen wollen, geben wir den `AudioStream` zu der Sound-Datei, die Lautstärke, den Pitch und die Start-Position an.
    2. Wir instanziieren einen `AudioStreamPlayer` mit den oben genannten Parametern.
    3. Wir pausieren den vorherigen `AudioStreamPlayer` und starten den neuen.
    4. Wir fügen den `AudioStreamPlayer` BGM als Kind hinzu.

    Diese Methode ist dafür zuständig einen neuen `AudioStreamPlayer` zu instanziieren.

    1. Wir holen uns den Dateipfad des `AudioStream` und damit dann den Dateinamen.
    2. Wir instanziieren einen neuen `AudioStreamPlayer` und setzen notwendige Parameter. Zusätzlich verbinden wir Signale welche wir benutzen um `AudioStreamPlayer´ die nicht mehr gebraucht werden wieder zu entfernen und Referenzen zu ihnen zu säubern.
      Dies ist zum Beispiel der Fall wenn das Ende einer nicht-loopenden Audio-Datei erreicht wurde.
    3. Das Dictionary _a_bgm fügt den `AudioStreamPlayer´ zu einem Array hinzu welches durch den Dateinamen referenziert werden kann.
    Code
    func _set_last_bgm_stream_paused(p_paused):
    if _a_BGM.get_child_count() > 0:
    var last = _a_BGM.get_child(-1)
    last.set_stream_paused_(p_paused)

    Diese Methode ist dafür zuständig den vorherigen `AudioStreamPlayer` entweder zu pausieren oder zu unpausieren.

    Mit "vorherigem" wird in diesem Fall der `AudioStreamPlayer` gemeint, der momentan oben auf dem Stack liegt.

    1. Wenn etwas auf dem Stack liegt, holen wir uns den untersten `AudioStreamPlayer` im SceneTree, also den obersten auf dem Stack.
    2. Wir pausieren oder unpausieren diesen `AudioStreamPlayer`.

    ❄️BGM stoppen❄️

    Code
    func stop_bgm(p_file_name):
    var players = _a_bgm[p_file_name]
    var player = players[-1]
    player.queue_free()

    Diese Methode ist dafür zuständig ein BGM Audio zu stoppen.

    1. Wir holen uns das Array aus `AudioStreamPlayer` welches zu dem Dateinamen gehört.
    2. Wir löschen den `AudioStreamPlayer` der das hinterste Element in diesem Array ist. Das ist quasi ein Stack in einem Stack: Wenn wir zwei Audio-Dateien mit demselben Namen abspielen, können wir sie nurnoch durch die Reihenfolge in diesem Array unterscheiden.
    Code
    func _on_BGM_tree_exited(p_file_name):
    var players = _a_bgm[p_file_name]
    players.pop_back()
    if players.is_empty():
    _a_bgm.erase(p_file_name)
    
    
    _set_last_bgm_stream_paused(false)

    Diese Methode ist dafür zuständig Referenzen zu einem `AudioStreamPlayer` zu löschen.

    Sie wird aufgerufen, wenn ein `AudioStreamPlayer` den SceneTree verlassen hat.

    Als wir das Signal dafür verbunden haben, haben wir den Dateinamen der Datei die der

    `AudioStreamPlayer` abgespielt hat als Parameter hinzugefügt.

    1. Wir holen uns das Array aus `AudioStreamPlayer` welches zu dem Dateinamen gehört.
    2. Wir löschen das letzte Element aus diesem Array.
    3. Wenn dieses Array nun leer ist, löschen wir den Dateinamen ganz aus dem Dictionary.
    4. Wir unpausieren den vorherigen `AudioStreamPlayer`.

    Das deckt die grundlegenden Funktionen auch schon ab. Der Code für SFX und BGS ist hierzu

    analog, außer dass wir uns hier nicht darum kümmern müssen, dass nur ein `AudioStreamPlayer`

    gleichzeitig Audio abspielt.

    ❄️Mapwechsel❄️

    Interessant wird es noch beim Mapwechsel: Es ist nämlich sinnvoll für jede Map einen

    eigenen Stack zu haben. Wenn wir immer denselben benutzen würden, wäre nicht klar, wann wir

    ihn jemals wieder abbauen können.

    Deswegen speichern wir den Stack beim Verlassen einer Map

    für diese Map ab, und laden dann den Stack der neuen Map.

    Es gibt noch den Sonderfall, bei

    dem der momentane `AudioStreamPlayer` der vorherigen Map dasselbe BGM Audio abspielt wie

    auf der neuen Map abgespielt werden soll.

    Hier wäre es nun blöd zwar beim selben Lied zu

    bleiben, aber dann in diesem Lied zu einer anderen Stelle zu springen. Hierfür löschen wir

    alle Elemente im Stack der vorherigen Map außer das oberste (flatten) und ersetzen die

    Parameter dieses `AudioStreamPlayer` mit den Parametern, die zu dem neuen obersten

    `AudioStreamPlayer` gehören würden.

    Diese Methode ist dafür zuständig relevanten Daten des BGM Stacks zu speichern.

    1. Wir erstellen ein neues Array zu welchem wir die Daten hinzufügen werden
    2. Wir fügen relevante Daten in ein Dictionary ein.
    3. Wir fügen dem Array das Dictionary hinzu.

    Diese Methode ist dafür zuständig relevanten Daten des BGM Stacks zu laden.

    1. Wenn der BGM Stack nicht leer ist, holen wir uns den obersten `AudioStreamPlayer` und löschen alle anderen.
    2. Für alle Daten zu einem `AudioStreamPlayer´ im Stack:

    2.1 Wir holen uns relevante Daten aus dem Dictionary

    2.2 Alle außer den obersten `AudioStreamPlayer` fügen wir einfach dem Stack hinzu, dessen Daten überschreiben die des vorherigen obersten `AudioStreamPlayer` falls sie dieselbe Audio-Datei abspielen wollen. Falls der vorherige aber eine andere abgespielt hat, wird er auch gelöscht.

    Diese Methode ist dafür zuständig die Eigenschaften eines `AudioStreamPlayer` zu überschreiben,

    oder einen neuen `AudioStreamPlayer` zu erstellen, falls es noch keinen `AudioStreamPlayer`

    gibt, der die gewünschte Audio-Datei abspielt.

    1. Wir holen uns wieder den Dateinamen des `AudioStream`
    2. Wenn in unserem Dictionary für BGM dieser Dateiname bereits verwendet wird, überschreiben wir nur die Parameter des obersten `AudioStreamPlayer` der zu diesem Dateinamen gehört. Ansonsten erstellen wir einen neuen.

    Im heutigen Türchen steckt was für all die Refmap-liebhaber da draußen!

    Ben hat für euch in seinem Fundus geschaut und diese coolen Interior-Edits bereitgestellt!

    Und wie das aussehen könnte, seht ihr hier an diesem kleinen Beispielscreen ^^





    flag_ger Nutzungsbedingungen

    - Free to use for everything (gemäß dem was FSM dazu sagt laut eigener HP, dh für kommerzielle Sachen lieber nochmal persönlich nachschauen / abklären).
    - Editieren und weiterverteilen ausdrücklich erlaubt und erwünscht!
    - Credits gehen immer an Refmap /FSM
    - Gerne für "14-hut-inside auch Credit User "Ben" geben (also mir :D)
    vor allem würde ich mich aber ultra freuen zu sehen, was damit gemacht wird.


    flag_eng Terms of Use
    - free to use for everything ( see FSMs own homepage, for commercial use you better look it up yourself / ask)
    - free to edit and share
    - credits to Refmap /FSM
    - credit "Ben" aswell
    show me what you made with it!