Verhindern, daß eine Aktion/Event mehrmals ausgeführt wird

  • GM 8
  • Verhindern, daß eine Aktion/Event mehrmals ausgeführt wird

    Hallo, ich schon wieder - mit einem neuen Problem. Wie bitte kann ich denn verhindern, daß eine bestimmte Aktion oder ein Event mehrmals ausgeführt wird, nur weil es im Step-Event aufgerufen wird? Wenn ich z.B. 10% Gesundheit abziehe bei der Kollision, dann bekommt der Spieler, der ganz langsam die Figur steuert, gleich 10 mal 10% Prozent abgezogen. Gleiches passiert, wenn Animationen ausgeführt werden sollen, aber der Spieler nicht so fix seine Figur steuert wie andere.
    Bei einer Animation könnte ich zur Not 2 Anims anfertigen und sagen "End of Animation" (was aber auch aufwendiger ist), aber wie mache ich das bei Gesundheit/Scores und anderem?
    Gibt es da irgendeinen Befehl für?

    Danke schon mal im voraus,
    Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • Du könntest z.B. eine Variable einführen, die dafür sorgt, dass der Spieler für ein paar Sekunden unverwundbar wird, wenn er getroffen wird. Setz bei der Kollision einfach diese Variable auf den gewünschten Wert und lass dann über ein Alarm-Event die Zeit runterticken, bis wieder Schaden möglich ist. So mach ich das zumindest bei meinem aktuellen Projekt, da funktioniert das ganz zu meiner Zufriedenheit - wie du das deichselst, hängt natürlich vom Spielgeschehen ab.

    Im Fall eines Falles gibt es außerdem noch die "User Defined"-Events und (zumindest im GM8) Trigger. Erstere werden nur ausgeführt, wenn du sie von einem anderen Event aus auslöst, zweitere erlauben dir, eigene Bedingungen für das Auslösen eines Events zu schreiben. Mach dich mal in der Hilfedatei schlau, da holste garantiert noch mehr raus. ;)
  • Irrenhaus3 schrieb:

    Du könntest z.B. eine Variable einführen, die dafür sorgt, dass der Spieler für ein paar Sekunden unverwundbar wird, wenn er getroffen wird.
    Ja, danke für den Tipp. Hört sich sehr vernünftig an. Fragt sich nur, wie ich ihm sage, daß er "unverwundbar" ist...
    "Wenn unverwundbar = true dann .....??" ;(
    Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:
  • Ja genau. Dein Ansatz ist richtig.

    Im Create Event erstellen wir die Variable. z.B.

    GML-Quellcode

    1. unverwundbar = 0;


    Und wenn ihm dann Gesundheit abgezogen wird schreiben wir einfach eine if Abfrage davor:

    GML-Quellcode

    1. if (unverwundbar == 0) {
    2. // Hier Leben abziehen
    3. unverwundbar = 1; // Da nun unverwundbar auf 1 steht, wird keine Gesundheit mehr abgezogen
    4. alarm[0]= 30; // Nach 30 Steps stellen wir Gesundheit wieder auf 0.
    5. }

    Im Alarm 0:

    GML-Quellcode

    1. unverwundbar = 0; // => Dadurch wird die IF-Abfrage im Step Event wieder erfüllt und für 1 Step die Gesundheit abgezogen.


    Bitte versuch das zu verstehen (habs extra kommentiert) und mach nicht gleich nur Copy&Paste ;)

    MfG xxskxx
    -
  • xxskxx schrieb:

    Bitte versuch das zu verstehen (habs extra kommentiert) und mach nicht gleich nur Copy&Paste


    Vielen Dank, daß Du Dir die Mühe gemacht hast! Ich setze mich seit gestern damit auseinander und hab das m.E. auch verstanden, trotzdem hab ich irgendwo einen Fehler drin. Liegt vielleicht daran, daß ich die Kollision gar nicht im Step-Event aufrufe, sondern im Kollision-Event des anderen Objekts....? Aber das müsste doch dasselbe sein... *grumpf*

    Also, mal Schritt für Schritt:

    - Ich habe ein Alibi-Objekt, das immer mitwandert, für alle Draw- und Alarmroutinen und so. Hier habe ich den Alarm[0] im Create-Event eingerichtet und dann im Alarm 0 "global.unverwundbar" auf 0 gestellt.
    - Im Kollisions-Event (nicht Step!) wird jetzt die Gesundheit abgezogen, wenn unverwundbar auf 0 steht. Und zudem alarm[0] wieder 30 zugewiesen. Das war doch alles richtig, oder....? :huh:

    Beim Testlauf springt auch die Variable unverwundbar von 0 auf 1 und zurück - aber "alarm[0]" bleibt irgendwie ständig auf -1 stehen. Der wird offenbar gar nicht ausgelöst. Jedenfalls: obwohl die Variable von 0 auf 1 springt, wird 10 mal die Gesundheit abgezogen, was ja verhindert werden soll.

    Wo liegt denn jetzt mein Fehler? Hab ich doch irgendwas in eine falsche Routine geschrieben?
    Wäre ganz toll, wenn mir jemand hier noch mal weiterhelfen könnte, ich such den Fehler schon seit gestern abend...

    Danke,
    Archie
    ___________________


    Nachtrag: doch, der Alarm wird runtergezählt. Hätte ich statt "alarm[0]" auch "obj_alibi.alarm[0]" eingegeben, hätte ich das auch früher bemerkt. Dennoch wird weiterhin die Gesundheit x-mal abgezogen...
    __________________

    Also, ich hab den Fehler jetzt inzwischen gefunden. Dadurch, daß alles aus dem Step-Event in den Kollision-Event verschoben wurde, blieb ein "unverwundet=0" im Step zurück. Jetzt macht er, was er soll, jedoch:

    ich glaube nicht, daß diese Lösung infrage kommt, denn die Zeitspanne reicht nur für eine bestimmte Geschwindigkeit aus. Sollten mehrere Objekte hintereinander sein und der Spieler ist schneller, bleibt er unverwundbar. D.h. ich müsste die Zeitspanne im Alarm-Event der Geschwindigkeit meines Balles anpassen - und das für alle bisher 42 Objekte, sämtliche Sounds, die auch mehrfach gespielt werden und und und. Ich glaube net, daß man das so machen kann....

    Archie
    Signatur? Ich überlege mir noch eine. Die besten sind ja schon alle vergeben... :para:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Archie ()