Funktion einer anderen Instanz aufrufen, User-Event und doppelte Zuweisung / Fragen

  • Funktion einer anderen Instanz aufrufen, User-Event und doppelte Zuweisung / Fragen

    Jetzt haben sich auch bei mir ein paar Fragen ergeben, die ich gerne beantwortet hätte :)

    1) irgendwo habe ich gelesen(finde es nicht mehr), dass man eine Funktion über eine andere Instanz
    aufrufen kann, also in der Art von: oEnemy.lengthdir.x(len, dir) // Aufruf in der Instanz oPlayer
    So funktioniert es nicht, aber irgend wie soll das gehen, mit Klammern oder so.

    2) mir kam mal ein Aufruf in der Art von: xx = random(5) * 50 = 100 unter, wie wird ein solches Konstrukt
    von GM ausgewertet und was ist der Zweck davon?

    3) mir kommt ein User-Event vor wie, in anderen Sprachen, eine Unterroutine, ist das richtig oder falsch
    und kann mir bitte ein Beispiel nennen, wo ein User-Event sinnvolle Verwendung findet?


    Vielen Dank schon mal,
    Miradur
  • Bezüglich 1) meinst du vermutlich das with-Statment. Damit kannst du einen Block Code so behandeln, als würde ihn eine andere Instanz ausführen. Zum Beispiel so:

    GML-Quellcode

    1. i = instance_create(x,y,ein_objekt);
    2. with(i){
    3. ein_skript(id);
    4. direction=133.7;
    5. speed=4.2;
    6. }


    2) hängt von den Operatorpräzedenzen im GM ab und davon, ob das "=" zwischen "100" und "random(5)*50" hier als Vergleichs- oder Zuweisungsoperator benutzt wird. Dafür bin ich in der GML nicht mehr genug drin, und hab auch keinen GM zum ausprobieren parat.

    Bezüglich 3) übersetzt sich das mehr oder weniger in das SDL-Feature des gleichen Namens. Das ist ein Entgegenkommen von SDL an dich als Spieleprogrammierer, für den Fall dass du dir nicht eine eigene Event Queue schreiben willst/kannst.
    Im GM ist der Anwendungsfall weniger allgemein als in der SDL, da ist das eher ein Bequemlichkeits-Feature. (Achtung, neblige Halberinnerungen voraus)
    Man könnte sich z.B. überlegen: Wenn dein Spieler stirbt, willst du, dass der Gegner, der ihn übern Haufen geschossen hat, mal kurz hämisch lacht und in die Kamera grinst. Dann könntest du das über ein "PlayerDeathEvent" lösen (also eins der User-Events, das diese Rolle erfüllt), auf das der Gegner reagieren kann, der die tödliche Kugel abgefeuert hat. Ich weiß allerdings grad nicht mehr, ob man in dem GM-User-Events auch beliebige Daten mitschicken kann - beispielsweise instance-IDs. Wenn nicht, vergiss dieses Beispiel, dann kann der Fiesling nämlich nicht aus dem Event erkennen, dass er die richtige Instanz ist.
    Ein anderes Beispiel, das ohne User-Daten auskommt: Ein "ResetLevelEvent". Jeder, der darauf reagiert, kann sich in einen Initialzustand zurücksetzen, ohne dass du mit restart_room eventuell mehr resettest, als du eigentlich wolltest.
  • Hi und danke für Deine Antwort, das mit "with" kenne ich natürlich, hab es jetzt auch mal
    im englischen Forum gepostet und dort ausdrücklich, darauf hingewiesen :) .

    So bald ich etwas erfahre, werde ich es hier kund tun.

    Bei 2 könnte es auch sein, dass GM einfach eine boolsche Auswertung vornimmt, wenn es
    eine doppelte Zuweisung gibt. Dieses Konstrukt ist mir jetzt schon ein paar mal begegnet,
    und ich kenne das, aus anderen Programmiersprachen, nicht.
    Also quasi, nur wenn die zufällige Zahl 100 ergibt, dann ist xx "wahr" oder wird xx mit 100
    gesetzt und an sonsten eben Null, was ja auch ein "falsch" wäre.
    Vielleicht test ich das heute mal und werde bei gelingen, ebenfalls hier Bericht erstatten.


    Miradur
  • So, hier mal der englische Thread zur 1. Frage:

    Antwort zur 1. Frage

    Grundsätzlich scheint es über eine Variable möglich zu sein:

    Quellcode

    1. enemy.variable = lengthdir.x(x1, y1, x2, y2)

    Das ist aber nicht das, was ich gesehen habe, denn da wurde eine Lösung gepostet,
    die das Ganze in Klammern gesetzt hat, damit es funktioniert.
    Egal, zumindest wieder was gelernt :)

    @glim888: in dem Fall, ersteres, das zweite ist ja die Kurzform von einer if Schleife.
    Und ich verstehe jetzt user-events tatsächlich als Unterroutinen, wobei dadurch bloß
    das Step-Event aufgeräumter aussieht, an sonsten sehe ich da jetzt keinen besonderen
    Vorteil darin.

    Miradur
  • Neu

    Hab da eine coole Seite entdeckt(auch schon was bei der ISO Frage was dazu gepostet),
    auch zu dem Thema hier, hat der Typ was zu bieten, falsch verstandene User-Events
    und wie man es besser lösen könnte.
    Also wenn Du da durch steigst @glim888, erklär es mir bitte 8o , ich hab keine Ahnung,
    was der Typ da aufführt, aber er scheint ein Script in sich selbst aufzurufen.

    Das ist auch der Programmierer von GMLife, hat sich da mal eben einen eigenen Compiler
    Zugang zu GM programmiert und man kann damit Änderungen am Spiel machen, während
    es läuft. Yellowafterlife ist sein Name und er ist einfach nur krass:

    yal.cc/gamemaker-instance-methods/

    Einmal so programmieren können :D

    Miradur


    PS.: Nidhogg hat er auch programmiert.
  • Neu

    Also ein Script in sich selbst aufrufen (rekursion) geht aufjedenfall und macht auch in manchen Szenarien Sinn, eigentlich überall da wo du durch eine Art Schleife iterierst und sich nur die Parameter ändern. Hab das schon für Kollisionen benutzt, wo man ein Objekt anschiebt und wenn es auf ein anderes dynamisches Objekt trifft ruft es sich erneut auf mit der neuen Instanz. Habe vor 2 - 3 Jahren hier für jemanden mal ein Laser script gecoded, wenn ich mich recht entsinne war das auch rekursiv.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Neu

    Jup Yal ist richtig "krank".

    So wie ich das sehe erstellt er nur ein Array in dem die Instanz und das Script steht welches die Instanz aufruft. Also eine Art Methode. Das Array hat den Namen der Methode.

    GML-Quellcode

    1. take_damage = [self, scr_enemy_take_damage];


    Die Funktion mt macht aus dem Array dann die "Methode".

    - ruft also von der Instanz (take_damage[0]) aus die Funktion (take_damage[1]) auf.

    Wenn ein "Child" die Funktion take_damage anders verwenden möchte, dann kann man take_damage ganz einfach überschrieben


    GML-Quellcode

    1. take_damage = [self, scr_enemy_take_half_dmg];
  • Neu

    Hat mich jetzt doch mal interessiert und ich hab nochmal gesucht, hatte das falsch in Erinnerung mit dem Laser script, hier schieb ich das jedoch nochmal ein da ich denke es ist schon längst in Vergessenheit geraten (oder nie "Bekannt" gewesen) und da mich das damals ein paar Stündchen gekostet hat wär ich froh wenn es jemand noch irgendwie benutzen kann:
    -LaserThread
    auch wenns etwas off topic ist aber ich denke die Eigenwerbung passt hier ganz gut man muss ja nicht alte Zombiethreads wiederbeleben. Ist auch eine schmale Demo dabei.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Neu

    Werde es auf jeden Fall, auf meine Agenda setzen :) , hab auch mal ein(für mich) ein
    absolut geiles Programm geschrieben, in Assembler und an eine Computer-Zeitschrift
    gesendet. Ich habe nie eine Antwort erhalten, Genialität liegt wohl zu sehr, im Auge des
    Betrachters :D .
    Werde wahrscheinlich nichts von Deinem Code verstehen, aber ich berichte Dir, wenn
    ich ihn mir angesehen habe.

    Miradur
  • Benutzer online 1

    1 Besucher