Arbeiten mit Extensions

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Arbeiten mit Extensions

      Neben der Vista-Kompabilität sind die Extensions wohl der relevante Grund, den Wechsel von 6 auf 7 mitzumachen. Sie erlauben es einem, große Engineblöcke effizient auszulagern, um sie somit gezielter bearbeiten zu können und auch später in andere Projekte einbauen zu können. Wer sich z.B. einmal eine gute Kameraengine schreibt, muss dies vermutlich nie wieder tun.

      Ich bin dabei für Disordia alle Teilengines auszulagern, und bin auf das Problem der Variablen gestoßen:
      Wir können aus speichertechnischer Sicht nicht alles mit globals zupflastern. Auch ist dann das Risiko zu groß, sich bei der Benennung selbst in die Quere zu kommen. Folglich brauchen wir lokale Variablen. Und für lokale Variablen brauchen wir Objects. Kein Problem, ich skizziere mal eine Standard-Extension nach meinem Schema:

      myextension ist eine Erweiterung, die bei ihrer Initialisierung eine eigene Instanz erstellt. Diese Instanz dient primär als Variablenspeicher - damit sie anderen Dingen nicht in die Quere kommt, wird sie immer deaktiviert - somit kann sie auch nicht versehentlich vom Benutzer angesprochen werden (bis auf eine Ausnahme, zu der ich gleich komme).
      Sämtliche Aktionen spielen sich in anderen Scripts ab, die diese Instanz nur als Quelle benutzen. Daher muss sie auch nicht aktiviert sein. Hier zwei Kernstücke dieser Erweiterung:

      myextension_init:

      GML-Quellcode

      1. global.myextension = object_add();
      2. object_set_persistent(global.myextension,true); // für Raumwechsel
      3. // Warum gibt es object_get_name und nicht set_name? Eine global muss wohl sein...
      4. // Hier könnte man für Events Code hinzufügen, z.b. für das Destroy Event zwecks Deinitalisierung
      5. instance_create(0,0,global.myextension);
      6. with (global.myextension)
      7. {
      8. // Variablen initialisieren etc.
      9. }
      10. instance_deactivate_object(global.myextension);

      myextension_command:

      GML-Quellcode

      1. if !variable_global_exists("myextension") then /* nicht initialisiert*/ ;
      2. if !object_exists(global.myextension) then /* nicht initialisiert*/ ;
      3. instance_activate_object(global.myextension);
      4. if !instance_exists(global.myextension) then /* oh, ein Problem... */;
      5. // var returnval;
      6. // Hier der Befehl, der den Variablenzugriff braucht
      7. // returnval = (...);
      8. instance_deactivate_object(global.myextension);
      9. // return returnval;


      Zusätzlich würde es noch myextension_doastep geben, um regelmäßige Prozesse auf Abruf durchzuführen (damit der Benutzer diese Prozesse auch gezielt kontrollieren kann).

      Dabei gibt es ein Problem: Obwohl die Isolation ziemlich perfekt ist, wird sie durch instance_activate_all gekillt - man könnte natürlich über alle drei stepevents etc Sicherungen einbauen. Da man weder hooken kann (eigenen Code zu bestehenden Funktionen hinzufügen), noch auf ein Event "On Activation" zugreifen kann, ist das die einzige Option.

      Nun meine Frage: Was haltet ihr von diesem Schema mitsamt seinem Problem? Haltet ihr es für das bestmögliche? Habt ihr eine bessere Idee? Habe ich einene wesentlichen Punkt übersehen? Oder konnte ich mich vielleicht gar nicht verständlich machen?
      Ich habe bisher fast immer alles auf eigene Faust gemacht, aber bei dieser Sache brauche ich Gewissheit, da sie zu den tiefsten Wurzeln von Disordia gehören wird.
      Vielen Dank im Vorraus.