Script bei Ereignis ändern

  • GM 8

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

  • Script bei Ereignis ändern

    Hallo,
    Wenn eine bestimmte Variable =0 ist wird ein objekt erzeugt, durch ein script wird dann der sprite gedrawt. Ich will jetzt lediglich wenn die Variable =1 ist, das selbe Script nur mit anderen Sprites gedrawt wird.

    Step Event des Spielers:
    Spoiler anzeigen

    GML-Quellcode

    1. {
    2. if (!global.chance_block)
    3. {
    4. crit_chance=random(100);
    5. global.chance_block=true; //block, damit er nicht ständig eine neue Random zahl berechnet
    6. }
    7. }
    8. if (crit_chance<50)
    9. {
    10. global.crit_dmg=1;
    11. global.TotalDMG = global.MaxDMG*2;
    12. }
    13. else
    14. {
    15. global.crit_dmg=0;
    16. global.TotalDMG = global.MinDMG+floor(random(global.MaxDMG+1-global.MinDMG));
    17. }
    Alles anzeigen


    Bei Kollision mit einem Objekt wird das zu Drawente Objekt erzeugt.

    GML-Quellcode

    1. ind = instance_create(x,y-35,obj_dmg_text);
    2. ind.dmgstr = string(global.TotalDMG);


    In dessen Draw Event:
    Spoiler anzeigen

    GML-Quellcode

    1. if (global.crit_dmg==0)
    2. {
    3. script_execute(0,dmgstr,x,y,15,zahlen_spr);
    4. }
    5. if (global.crit_dmg==1)
    6. {
    7. script_execute(0,dmgstr,x,y,15,zahlen_spr2);
    8. }

    Zweimal das selbe script nur mit unterschiedlichem Sprites.

    Im create Event dessen Draw objekts:

    GML-Quellcode

    1. global.chance_block=false;

    Damit er Random(chance) fortsetzt.

    Die Probleme:
    -Es werden alle erzeugten Sprites bei global.crit_dmg==1 geändert, es soll aber nur eins geändert werden.
    -Noch andere komische bugs...

    Hoffe jemand kennt eine Bugfreie Methode.
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.
  • Zunächst mal würde ich auf script_execute verzichten, das ist in diesem Fall schlechter Stil und kostet nur unnötig Rechenzeit. Ruf die Funktion einfach direkt auf, über: scriptname(foo,bar,argu,mente,hier)
    Und ansonsten: Was macht der Skript, den du da ausführst, was sind die "komischen Bugs", von denen du sprichst und warum machst du das mit crit_dmg über eine globale Variable, die du von allen obj_dmg_text-Objekten aus abfragst? Ist ja logisch, dass die sich alle ändern, wenn du den einen Wert änderst, auf den sie sich alle beziehen. ;)
  • Der Script wandelt lediglich die Zahlen 0-9 in Zahlen-Sprites um, also für jede Zahl ein Eigenes Sprite.
    crit_dmg hab ich global gemacht damit ich von obj_dmg_text darauf zugreifen kann, oder wie soll ich sonst einen Bezug darauf bekommen?

    Das mit dem script direkt aufrufen (foo,bar,argu,mente,hier) hab leider keine Ahnung was diese abkürzungen heißen sollen bzw wie man dort mehrere Argumente definiert. :S
    Hab vorher auch noch nie scripts benutzt.
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.
  • Tice schrieb:

    Im script benutzt du einfach argument0-16 als argumente, GameMaker regelt das von alleine falls du zu wenig argumente angibst als du im Script benutzt

    Aber nur wen "Throw an error when arguments aren't initialised correctly. Nich angekreuzt ist!(Falls ichs grade richtig verstanden habe)
  • DragonXZ schrieb:

    crit_dmg hab ich global gemacht damit ich von obj_dmg_text darauf zugreifen kann, oder wie soll ich sonst einen Bezug darauf bekommen?

    Übergib die Variable einfach nur einmal pro erstellter Instanz - nämlich wenn sie erstellt wird.
    Verpass dem Objekt obj_dmg_text im Create-Event eine Variable, z.B. is_critical.
    Im Kollisionsevent, in dem obj_dmg_text dann erstellt wird, machst du einfach sowas wie:

    GML-Quellcode

    1. (...)
    2. ind.dmgstr=string(global.TOTALdmg);
    3. ind.is_critical=/*True oder False, je nachdem*/


    Somit hat jede neue Instanz von obj_dmg_text ein eigenes Flag und du sparst dir nicht nur die globale Variable, sondern auch die einhergehenden Bugs.


    DragonXZ schrieb:

    Das mit dem script direkt aufrufen (foo,bar,argu,mente,hier) hab leider keine Ahnung was diese abkürzungen heißen sollen bzw wie man dort mehrere Argumente definiert.

    Statt script_execute(index,a1,a2,a3,...) benutzt man einfach die Notation index(a1,a2,a3). Wie bei jeder anderen Funktion auch. script_execute ist eher für sowas wie eine Liste voller Funktionsindizes gedacht, aus der heraus man dann eine ausführen will. In anderen Programmiersprachen gibt's für sowas Pointer, die auf die entsprechenden Funktionen zeigen. Der GM macht's dir da etwas einfacher.
    ...aber wie gesagt, sowas brauchst du nur, wenn der Skript, den du aufrufen willst, während des Programms regelmäßig ein anderer ist. In deinem Fall ist das nicht nötig, sondern eher kontraproduktiv.
  • Danke! Es funktioniert jetzt alles!
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.