Lebenszyklus, Variablen, Daten - Allgemeines zur Programmierung in MV

  • Hallo zusammen,


    ich würde hier allgemeine Hilfen, Hinweisen, Richtlinien und Funktionsweisen des RPG Maker MV zum Thema Programmierung posten und aktuell in diesem Post halten. Wenn jemand allgemeine kurze Themen noch einfallen bitte kurz in diesem Thread posten.

    Es geht darum, wie der RPG Maker MV funktioniert. Wie und wann der 'Core Code' was macht. Ein solches Verständnis ist oft essentiell und ermöglicht den Einstieg in die Programmierung für MV.


    Basis-Verständnis von JavaScript wird vorausgesetzt (Achtung: Womöglich reicht Basis-Wissen nicht aus ;) ).

    Maker Daten

    Wann immer der Benutzer von RPG Maker MV etwas in dem Editor bearbeitet werden diese Daten in Datendateien mit Endung .json in /data gespeichert. In diesen Dateien stehen alle Informationen über Maps, Events, Items usw. Die Dateien sind lesbar, weil sie letzendlich nur Textdateien in einem bestimmten Format sind. Bei jedem Start des Spiels und des Editors werden die Datendateien ausgelesen, gespeichert und verwendet.

    Vererbung in JavaScript

    Die Core JavaScript Dateien in /js sind im gleichen Stil geschrieben. Basisklassen, die nur von Object erben, haben meist 'Base' in ihren Namen. Klassen die Eigenschaften und Funktionen von den Basisklassen erben werden in folgendem Stil geschrieben.

    In einer Instanz der Klasse kann über die Eigenschaft prototype auf die Funktionen der Basisklasse zugegriffen oder sogar verändert/überschrieben werden.

    Code
    1. // In JavaScript this function is constructor
    2. function Derived() {
    3. this.initialize.apply(this, arguments); // Delegate to initialize()
    4. }
    5. Derived.prototype = Object.create(Base.prototype); // Derived inherits from Base
    6. Derived.prototype.constructor = Derived;
    7. Derived.prototype.initialize = function () {
    8. Base.prototype.initialize.call(this); // This makes super.initialize() sense
    9. };

    Mehr Informationen zu Vererbung und Prototype in JavaScript: https://developer.mozilla.org/…e_and_the_prototype_chain

    Globale Variablen im MV

    Globale Variablen stehen jederzeit im Spiel zur Verfügung, da sie im Window-Objekt sind. Das Window-Objekt ist das globale Objekt in dem Variablen ohne Namensraum gespeichert werden. Zugriff auf das Objekt erhält man über die Konsole (F8) im Spiel und dort direkt $gameXxx, $dataXxx etc. eingeben. Letztendlich stehen die Variablen im Namensraum window.$gameXxx. Ich empfehle dringen immer den kompletten Namensraum, also mit window.Xxx zu verwenden, da JavaScript nach Variablen immer erst im lokalen Scope sucht und dann in dem nächst höheren Scope, also zu allerletzt im Window-Objekt. RPG Maker MV Core Code macht es nicht so. Stichwort Performance...


    Daten Variablen $dataXxx

    Die Daten-Variablen mit Namen $dataXxx werden von den JSON Dateien aus dem data Verzeichnis gelesen. Die Daten werden vom Editor verändert und können während des Spiels nicht verändert werden.


    Instanz-Variablen $gameXxx

    Alle Instanzen der Klassen, die in rpg_objects.js definiert sind werden in globalen Variablen mit Namen $gameXxx gespeichert.

    Wenn das Spiel gespeichert wird werden diese Objekte (außer $gameTemp, $gameMessage, $gameTroop) serialisiert und in JSON gespeichert.

    Beim Laden eines Spielstandes können diese Instanzen verwendet werden, da durch Deserialisierung die prototype-chain wieder vollständig hergestellt/geschrieben wird.

    Scene graph

    Der scene graph ist wie ein FLASH in Baumstruktur und wird von Pixi.js bereit gestellt. Kinder von Scenes sind immer abhängig von den Koordinaten und der Sichtbarkeit des Eltern Objekt.

    Registriere ein Kind (scene, sprite oder window) mit .addChild(child).


    Scene


    Im RMMV ist eine Scene das oberste Element von Scene Graph und Kinder sind Sprite oder Window. Der Lebenszyklus ist vom SceneManager verwaltet. Der Manager kann dabei nur eine Scene gleichzeitig bearbeiten.

    Lebenszykllus: new Scene_Xxx() -> create() -> start() -> update()* -> stop() -> terminate()

    Ablauf

    Initialisierung

    1. Wenn das Spiel/ die Seite geladen wird, wird SceneManager.run() aufgerufen (In main.js)
    2. Initilaisiere Klassen wie Graphics, WebAudio, Input, Touchinput
    3. Scene_Boot wird auf SceneManager gesetzt
    4. SceneManager.update wird in requestAnimationFrame registriert

    requestAnimationFrame (Pixi.js) wird vom Browser (Spiel) in bestimmten Zeitintervallen aufgerufen (Immer wenn gezeichnet werden muss).


    Frame Update

    1. requestAnimationFrame ruft SceneManager.update() auf
    2. Die aktuelle Scene wird jede 1/60 Sekunde zu den Scene Lebenzyklus regeln verarbeitet
    3. Wenn Scene_Xxx.update() aufgerufen wird, dann
      1. update() in allen Kindern auf.
      2. Kinder rufen rekursiv die update() Funktion ihrer Kinder auf.
    4. Die Scene, inklusive Kindern, wird gerendert
    5. SceneManager.update wird in requestAnimationFrame registriert


    Source

    https://github.com/rpgtkoolmv/…ipt/blob/master/README.md