Zeige Ergebnis 1 bis 15 von 15
  1. #1
    Benutzerbild von kad_we
    Registriert seit
    Sep 2004
    BNet Account
    kad_we
    Beiträge
    211

    Jass: Funktionen als Parameter und das dynamische Evententfernen

    Also ich habe wie oben erwähnt, 2 Probleme:
    1. Bei Funktionen, wie z.B. "PickEveryUnit" wird in Jass eine Funktion übergeben; Wie könnte ich so etwas beim WE für 2 Funktionen als Parameter übergeben? (wie muss die Deklaration dafür aussehen)?

    2. Gibt es eine Funktion, mit der ich wärend der Laufzeit Ereignisse entfernen kann (möglichst ein bestimmtes und nicht alle)?

    BIG thx kad_we

  2. #2
    AIAndy
    Guest
    Es gibt zwar eine Native zum Hinzufügen von Events, die zum Entfernen hat Blizzard aber vergessen. Um in Events aufzuräumen geht also nur den ganzen Trigger zerstören und neu aufzubauen.

  3. #3
    Benutzerbild von kad_we
    Registriert seit
    Sep 2004
    BNet Account
    kad_we
    Beiträge
    211
    1. und wie würde dass denn genau aussehen, wenn ich z.B. jeden Spieler ein Chatereignis genau einmal auslösen lassen will? dann brauch ich ein globales boolean Array, oder?
    2. was ist mit dem anderen Teil der frage?

  4. #4
    Mueslirocker
    Guest
    Original geschrieben von kad_we 2. was ist mit dem anderen Teil der frage?
    Funktionen, die per call back (wie im Pick-Every..) aufgerufen werden, können weder Parameter noch Rückgabewerte haben.

    Ausnahme gibt es nur beim Rückgabewert und das klappt nur wenn man Conditions benutzen will, Rückgabe muss das ein Boolean sein - ich vermute aber, dass dir das herzlich wenig hilft.

    Als Workaround kann man die Parameter global speichern, dann die Funktion aufrufen und dort dann als erstes die Parameter lokal speichern.
    Eine bessere Lösung kenne ich nicht.


    Hoffe mal, dass ich hier keinen Mist erzählt habe.

    Mueslirocker

  5. #5
    Benutzerbild von kad_we
    Registriert seit
    Sep 2004
    BNet Account
    kad_we
    Beiträge
    211
    wenn ich dich richtig verstanden habe, kann ich aber eine parameterlose Funktion als Parameter übergeben (oder gibt es Referenzen auf Funktionen?)! Wie wäre denn dann die Syntax dafür?

  6. #6
    AIAndy
    Guest
    Original geschrieben von kad_we
    1. und wie würde dass denn genau aussehen, wenn ich z.B. jeden Spieler ein Chatereignis genau einmal auslösen lassen will? dann brauch ich ein globales boolean Array, oder?
    In dem Fall löschst du am besten nicht das Ereignis sondern machst das mit einer Condition und wie du gesagt hast mit einem boolean array.

  7. #7
    Benutzerbild von kad_we
    Registriert seit
    Sep 2004
    BNet Account
    kad_we
    Beiträge
    211
    naja aber es wär doch wir "ökologischer" wenn ich einfach ein Event removen könnte...

  8. #8
    Mueslirocker
    Guest
    Original geschrieben von kad_we
    wenn ich dich richtig verstanden habe, kann ich aber eine parameterlose Funktion als Parameter übergeben (oder gibt es Referenzen auf Funktionen?)! Wie wäre denn dann die Syntax dafür?
    Der Typ des Parameters heißt "code"...

    Ich hätte das ganze so gemacht (und so ähnlich muss es eigentlich gehen), aber....
    Code:
    function foo takes nothing returns nothing
      local ... param1 = udg_param1
      local ... param2 = udg_param2
      ...
      //actions...
      set udg_result = ...
    endfunction
    
    function bar takes code func returns nothing
      local ... result
      set udg_param1 = ...
      set udg_param2 = ...
      ...
      call func
      set result = udg_result
    endfunction
    
    function main takes nothing returns nothing
      call bar(function foo)
    endfunction
    ... der rote Teil ist falsch... kann jemand berichtigen?

    Erklärung:

    Die Funktion bar bekommt eine Funkton (func) als Parameter, setzt globale Parameter, führt die übergebene Funktion aus und speichert dann das Ergebnis, welches zuvor global gespeichert wurde, lokal ab.

    foo ist die Funktion, die übergeben wird. Sie speichert zu erst die globalen Parameter lokal ab, führt dann die Berechnungen durch und speichert das Ergebnis (Rückgabewert) dann global ab.

    Die Funktion main macht eigentlich nichts... sie ruft halt nur bar mit foo als Parameter auf.

  9. #9
    Benutzerbild von kad_we
    Registriert seit
    Sep 2004
    BNet Account
    kad_we
    Beiträge
    211
    schön und gut, aber was hilft mir das, wenn ich den Code nicht aufrufen kann? :-( aber trotzdem schonmal vielen dank...

  10. #10
    Mueslirocker
    Guest
    Original geschrieben von kad_we
    schön und gut, aber was hilft mir das, wenn ich den Code nicht aufrufen kann? :-( aber trotzdem schonmal vielen dank...
    Man kann den code aufrufen... ich dachte mit dem normalen "call"... bin mir eigentlich auch immer noch sicher... aber scheinbar irre ich mich... muss doch irgendwer bescheid wissen...

  11. #11
    AIAndy
    Guest
    Leider kann man code nicht direkt ausführen, nur indirekt über bestimmte natives.

  12. #12
    Benutzerbild von kad_we
    Registriert seit
    Sep 2004
    BNet Account
    kad_we
    Beiträge
    211
    Original geschrieben von AIAndy
    Leider kann man code nicht direkt ausführen, nur indirekt über bestimmte natives.
    toll das sagt mir jetzt dass ich Jass doch noch gar net beherrsche... Erklärung bitte!

  13. #13
    AIAndy
    Guest
    Der Variablentype code enthält eine Referenz auf eine Funktion.
    Im normalen JASS-Code selber kann man nichts mit dem Variablentyp code anfangen ausser ihnzu speichern und weiterzugeben.
    Es gibt aber eine Reihe natives, die code als Parameter haben. Dazu gehört TriggerAddAction, Filter, Condition, ForGroup, ...

  14. #14
    Benutzerbild von kad_we
    Registriert seit
    Sep 2004
    BNet Account
    kad_we
    Beiträge
    211
    wenn ich den Code also auführen will, wär es am sinnigsten, ihn zu einem Trigger zu adden, dann auszuführen und dann wieder zu löschen?

  15. #15
    AIAndy
    Guest
    Ja, aber meist ist da eben ExecuteFunc mit dem Funktionsnamen in String-Variablen besser geeignet und weitaus mächtiger.

Forumregeln

  • Es ist dir nicht erlaubt, neue Themen zu verfassen.
  • Es ist dir nicht erlaubt, auf Beiträge zu antworten.
  • Es ist dir nicht erlaubt, Anhänge hochzuladen.
  • Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
  •