Von GUI zu vJass ´ Multiplayertaugliche Zauber!

[contentad]


Von GUI zu vJass – Multiplayertaugliche Zauber!

zum Anfang

Einleitung

Ein herzliches Willkommen zum inwarcraft.de Mapping Tutorial
"Von GUI zu vJass – Multiplayertaugliche Zauber!".

Dieses Tutorial wird auf die Probleme der
Multiplayertauglichkeit (kurz MUI) von
GUI Zaubern eingehen, eine kurze Schnelleinführung in Jass und Timer
anschneiden und am Ende eine vJass Lösung erarbeiten, mit der die Einfachheit
der Realisierung von MUI Spells mit vJass gezeigt wird. Ein optionales
Zusatzkapitel gibt es dann noch für diejenigen unter euch, die glauben alles
verstanden zu haben und soweit mit den Grundlagen vertraut zu sein, dass sie
schon einen nächsten Schritt wagen können. Für diese Mapper gibt es noch das

"Externe Systeme" Kapitel, das vier vJass Systeme einführen wird, die
die Zaubererstellung noch um ein Vielfaches einfacher gestalten und sogar noch
Probleme, die mit den standard Jass Funktionen auftreten, beheben werden. Doch…

zum Anfang

… bevor es losgeht …

brauchen wir natürlich noch ein paar wenige Tools, damit wir
auch besser arbeiten können und vJass auch wirklich nutzen können. Und dafür
benötigen wir das viel gefürchtete und allseits bekannte Jass Newgen Pack (kurz
JNGP). Ums kurz zu machen: JNGP ist sozusagen der World Editor 2.0. Er bietet
einige nützliche Zusatzfeatures, die der normale Editor nicht bietet, wie z.B.
das einfache Verschmelzen von unterschiedlichen Mapdaten oder einen
Tooltipgenerator, der es auf einfache Art und Weise ermöglicht, farbliche
Tooltips zu gestalten. Was jedoch noch viel wichtiger ist: Er verwendet einen
neuen Compiler für den Triggercode und ermöglicht somit die Nutzung von vJass.
Hinzu kommen noch angenehme Erweiterungen wie ein Codehighlighting oder eine
Textvervollständigung für Jassfunktionen, sodass man sich nicht jede Jass
Funktion auswendig merken muss. Das JNGP findet ihr hier. Damit ihr es auch
noch auf den neuesten Stand bringt, müsst ihr noch Jasshelper aktualisieren
(sozusagen der Compiler für unseren angehenden vJass Code). Wie die
Installation und das Updaten funktioniert, zeigt das folgende kurze Video:

Alles installiert und voller Enthusiamus stürzen wir uns
gleich ins nächste Kapitel, das den Zauber beschreibt, den wir realisieren
werden.

zum Anfang

Die Idee des Zaubers

Als Thema wollte ich mal
wieder etwas mit Gift veranstalten und da ich die Map im Felwood Tileset
erstellt habe, wurde es schließlich ein Zauber für Furion! Der Zauber markiert
alle feindlichen, nicht-toten Einheiten in einem 1000 Radius und markiert sie
mit einem "Poison Marker". Nach 3 Sekunden werden dann alle zuvor
markierten Ziele von einem Shadow Strike getroffen, sofern sie sich weiterhin
innerhalb des 1000 Radius von Furion befinden.

Abbildung 1: Tooltip des Zaubers

Abbildung 1: Tooltip des Zaubers

Somit ein feiner und kompakter Zauber, der perfekt zur
Veranschaulichung der Probleme mit MUI dienen wird. Bevor wir uns nun aber an
die Heranarbeitung der GUI Lösung wagen, werde ich noch kurz auf die nötigen
Objekte eingehen, die wir dafür erstellen müssen. Damit ihr das nicht alles
selbst per Hand lösen müsst, könnt ihr einfach die Musterlösungsmap
runterladen. Diese beinhaltet bereits diese Objekte.

Beim Anschauen des Videos behaltet nochmal die folgende Kurzfassung
des Zaubers im Hinterkopf:

Schritt 1) Wir
"markieren" alle Ziele in einem 1000 Radius um Furion mit einem "Poison Marker"

Abbildung 2: Die markierten Ziele erhalten einen Giftwolken
Effekt, der an ihrem Kopf haftet

Schritt 2) Wir warten 3 Sekunden

Schritt 3) Wir entfernen von allen markierten Zielen die
"Poison Mark" Fähigkeit

Schritt 4) Für jedes Ziel erstellen wir einen Dummy, der
Shadow Strike auf es zaubert, sofern es sich noch in einem 1000 Radius
befindet.

Abbildung 3: Die Wartezeit ist um und Shadow Strikes fliegen
auf die zulässigen Ziele

Hier nun also das Video, das die benutzten Objekte einführt:

zum Anfang

Die Objekteditor Objekte

Anmerkungen zum Video:

  • Den Bewegungstyp vom dummy könnte
    man auch auf None stellen, dadurch wird er auch nicht mehr von fliegenden
    Pathing-Blockern gestört.
  • Weiters wird das Anklicken des dummies schon
    dadurch verhindert, dass man ihm das Model None.mdl gibt. Dennoch wird Locust
    benötigt, um ihn auch vor den angesprochenen Pickschleifen zu schützen.
  • Der Radius von Tornado Aura(Slow) muss nicht
    unbedingt auf 0 gestellt werden, wenn als Ziele nur Self,Invulnerable und
    Vulnerable ausgewählt ist. Ebenso wird bei einem Radius von 0 weiterhin die
    Einheitenkollision berücksichtigt.

zum Anfang

Der GUI Ansatz

Nun aber genug mit dem Kinderkram – wir wollen Ergebnisse
sehen! Also starten wir mit einem ersten GUI Ansatz. Dies geschieht in
folgendem Video, das Schritt für Schritt die GUI Lösung erarbeitet. Wer sich
bereits gut genug mit GUI auskennt und glaubt, jede Kleinigkeit zu wissen, der
kann dieses Video gern überspringen und gleich zum nächsten Kapitel
weitergehen. Eine fertige Lösung findet ihr in der Musterlösungsmap in der
Kategorie "Die GUI Lösung".

Anmerkungen zum Video:

  • Wenn der Fog of War aktiv ist,
    kann es dazu kommen, dass dummies den Shadow Strike nicht zaubern, da sie das
    Ziel nicht sehen.
  • Wegen der Einfachheit wurde das Zauberlevel
    nicht vor dem Wait abgespeichert. Würde man innerhalb der 3 Sekunden Wartezeit
    die Fähigkeit leveln, wäre die Shadow Strike Fähigkeit der dummies
    fälschlicherweise um ein Level höher.
  • Das Leeren der Gruppe ist sinnlos. Dies ist eine
    falsch Aussage im Video, die ihr bitte vergessen solltet ;)

Nach endlosem Geklicke und lustigem ßffnen der
verschiedensten Fenster und Dialoge sind wir endlich soweit. Unser GUI Trigger
ist fertig! Voller Stolz und mit einem Kribbeln zwischen den Fingern wollen wir
natürlich sofort unseren neuen Prachtzauber testen und die Treants, die nur
mehr darauf warten, unseren Zauber ins Gesicht zu kassieren, nicht länger
warten lassen. Damit ihr euch den Spaß nicht im Gedanken ausmalen müsst, wird
es natürlich auch hierzu ein Video geben. Dieses Video sollte nicht
übersprungen werden, da es auf die Probleme eingehen wird, die mit unserem
Ansatz entstehen.

Nachdem wir nun in Aktion erleben durften, was alles schief
läuft, wenn wir den Zauber innerhalb der 3 Sekunden Wartezeit mehrmals zaubern,
werden wir uns noch einmal kurz den GUI Trigger durchdenken, wieso es ingame so
abläuft, wie es abläuft.

zum Anfang

GUI und seine Probleme

zum Anfang

Weg mit den Waits – Timer wir kommen!

Einige von euch wussten es vielleicht schon und wiederum
andere glaubten bis jetzt, dass sie mit Waits eine beliebige Wartezeit
einstellen können. Das dem nicht so ist, zeigt ein einfacher Test. Stellt die
Wartezeit unseres Zaubers auf 0 Sekunden und testet selbst, was passiert. Ihr
werdet feststellen, dass die Shadow Strikes nicht sofort nach dem Zaubern
erscheinen, sondern erst mit einer gewissen Verzögerung. Diese Verzögerung
beträgt ungefähr 0.25 Sekunden, was zugleich der minimalen Wartezeit eines
Waits entspricht. Dass dies natürlich kein erwünschtes Ergebnis ist, kann man
sich auch einfach vorstellen. Vielleicht kennt ihr bereits Zauber, die selbst
ein Geschoss erstellen und dieses periodisch fortbewegen. Würde man dies mit
Waits realisieren, hätte man eine Bewegung, die nur viermal pro Sekunde aktualisiert
wird, was recht ruckelig auf dem Bildschirm erscheint, wenn es ein schnelleres
Geschoss sein soll. Damit wir später aber auch Zauber mit einem Geschoss
realisieren können und immer eine ziemliche exakte Wartezeit, egal welche
Wartezeit wir wählen, erhalten, müssen wir auf Waits verzichten und auf ein
einfaches Hilfsmittel zurückgreifen – die Timer.

Sicherlich kennen ein paar von euch schon das periodische
Event in GUI, das die Triggeraktionen periodisch aufruft bzw. das Timed Elapsed
Event, das die Triggeraktionen nach einer gewissen Verzögerung ablaufen lässt.
Diese zwei Events sind im Prinzip nichts anderes als Timer. Ein Timer ist eine
Stoppuhr, die entweder einmal ablaufen kann oder immer wieder (=periodisch)
abläuft. Der Vorteil von Timern ist, dass sie keine wirkliche minimale
Wartezeit besitzen und somit DAS Mittel zum Zweck sind, wenn es um
Verzögerungen oder periodische Dinge geht. Wie wir nun Timer verwenden, zeigt
das folgende Crashkurs Video, in dem wir die Erstellung eines Jass Triggers
lernen werden und einen einfachen Trigger erarbeiten, der auf Timer
zurückgreift. Ebenso werden kurz die wichtigsten Neuerungen des JNGP im Bezug
auf den Triggereditor erklärt, die für das Benutzen von Jass/vJass essentiell
sind.

Anmerkungen zum Video:

  • der gg_ Präfix steht für generated
    global.
  • eine weitere gute Seite zum Nachschlagen von
    Informationen bezüglich Jass oder Jass Funktionen, ist http://jass.sourceforge.net/doc/

Abbildung 4: Auch mehrmaliges Drücken der Escape-Taste macht
unserem Trigger nichts aus

Für ein paar von euch dürfte dieser Teil ein ziemlich harter
Brocken gewesen sein. Deswegen empfehle ich an diesere Stelle eine kleine Pause
einzulegen, bevor ihr euch an das nächste Kapitel herantastet. Experimentiert
vielleicht noch ein bisschen mit Timern herum und der Erstellung der Jass
Trigger, bis ihr euch damit sicher fühlt. Ist dies der Fall, steht dem nächsten
Kapitel nichts mehr im Wege. Wir wissen, wie man einen Jass Trigger erstellt,
wir wissen wie wir Timer benutzen, auf zur nächsten Stufe – vJass!

zum Anfang

Die Magie – vJass und die Zaubererstellung

Wir haben mit Hilfe des Timer Beispiels nun ein wenig Jass
kennengelernt und vielleicht hat sich der ein oder andere mittlerweile auch
eines der Jass Einführungstutorials durchgelesen. vJass ist im Grunde genommen
nun nichts anderes als Jass. Es bietet lediglich einige Zuästze, die es
ermöglichen unseren Code übersichtlicher und strukturierter verwalten zu
können. Da vJass sehr viele Möglichkeiten bietet und es den Rahmen dieses
Tutorials sprengen würde, auf jede einzelne Kleinigkeit einzugehen, werde ich mich
hier auf das meiner Meinung nach wesentliche beschränken, das in Verbindung mit
Zaubererstellung benötigt wird. Dabei werde ich auf folgende Punkte näher
eingehen:

  • Gültigkeitsbereiche (scopes und libraries)
  • frei definierbarer global-Block
  • structs


Gültigkeitsbereiche

Zu aller erst – Was ist ein Gültigkeitsbereich?

Wenn wir uns an die vorangegangenen Videos erinnern, habe
ich euch ja erzählt, dass globale Variablen global verfügbar sind und in jedem
Trigger verwendbar, während hingegen lokale Variablen nur innerhalb der
Funktion, in der sie erstellt wurden, gültig sind. Der Gültigkeitsbereich einer
globalen Variable ist also global und der Gültigkeitsbereich einer lokalen
Variable ist lokal auf den Gültigkeitsbereich der Funktion beschränkt. vJass
bietet nun die Möglichkeit Funktionen und Variablen in einen selbst definierten
Gültigkeitsbereich zu verwalten. Dafür gibt es die Schlüsselworte scope und
library. Der Unterschied zwischen diesen zwei keywords ist ähnlich wie bei der
Einhaltung der Funktionsreihenfolge. Wenn wir uns an das Timer Beispiel
erinnern – dort habe ich erwähnt, dass Funktionen nur auf andere Funktionen
zugreifen können, die oberhalb definiert wurden. Die Funktion "weiß"
also nur von der Existenz anderer Funktion, die bereits "vorher"
erstellt wurden. ßquivalent ist das ganze mit scopes und libraries. Libraries
werden beim Abspeichern der Karte zuerst "abgearbeitet" und erst dann
scopes, d.h. scopes können auf jede beliebige library zugreifen, da der
librarycode oberhalb des scopecodes steht.

Ein weiterer Punkt in Verbindung mit Gültigkeitsbereichen sind
die keywords public (=öffentlich) und private (=privat). Innerhalb eines
Gültigkeitsbereiches kann man Funktionen, Variablen und Strukturen privat oder
öffentlich setzen. Alles was privat ist kann nur innerhalb des
Gültigkeitsbereiches verwendet werden. Alles was öffentlich ist, kann auch
außerhalb verwendet werden. Stellen wir uns z.B. einen Zauber Trigger vor, in
dem wir Schadenswerte pro Stufe und die ID der Zauberfähigkeit abspeichern.
Schadenswerte sollten nun nicht von außen manipulierbar sein, nicht dass wir
uns aus versehen in irgendeinem anderen Trigger reinpfuschen und unser Zauber
plötzlich Einheiten mit einem Schlag töten würde. Wir würden die Schadenswerte
also privat setzen. Anders könnt es bei der ID des Zaubers sein, diese könnte
auch außerhalb nützlich sein um z.B. Synergien mit anderen Fähigkeiten zu
realisieren. Somit wäre es eine gute Wahl, diese ID öffentlich zugänglich zu
machen.

Soviel zur Grundtheorie von Gültigkeitsbereichen. Ich werde
nun noch die Theorie von structs vorziehen, bevor es dann wieder ans Praktische
geht, und wir gemeinsam im Video den vJass Code für unseren Zauber erarbeiten.

Strukturen

Ebenso wie Gültigkeitsbereiche sind auch Strukturen eine
Möglichkeit unseren Code sauber und logisch zu verpacken. Wie der Name schon
vermuten lässt, ist eine Struktur irgendetwas, das aus den "Aufbau"
eines "komplexeren" Objekts beschreibt.

Wenn wir uns z.B. ein Auto anschauen, so besteht ein Auto
aus vier Reifen, einem Motor, besitzt einen Hersteller, usw.. Nun wäre es doch
toll, wenn man diese ganzen Daten zusammenfassen könnte auf ein Objekt und
dieses Objekt uns Methoden zur Verfügung stellt um das Auto zu verwalten/zu
manipulieren. Ein solches Objekt kennen wir alle, auch wenn es uns bis jetzt
vielleicht nicht bewusst war – eine warcraft Einheit! Diese hat eine gewisse
Anzahl Leben, eine Menge von Manapunkten, eventuell Fähigkeiten, usw.. Eine
Einheit können wir dann mittels Funktionen manipulieren. So können wir eine
Einheit töten, ihr Leben geben oder Fähigkeiten von ihr entfernen. Und genau
das bietet das vJass Feature struct. Mit einem struct können wir uns selbst
solche Objekte basteln und genau nach so etwas suchen wir doch? Ein Zauber soll
nämlich beispielweise unseren Zauberer beinhalten, die Stufe des Zaubers, die
Schadenswerte und Effekte des Zaubers, usw.. Wie das nun alles realisiert wird
und wie die oben genannten Punkte zusammenspielen wird das nächste Video
erarbeiten. Dort werden wir nun ein vJass Template für Zauber Trigger
erarbeiten.

Die Praxis – der vJass Zaubercode

zum Anfang

Externe Systeme

Hier nun noch ein paar Worte zu nützlichen libraries, die
euch interessieren könnten. Um libraries zu verwenden, müsst ihr einfach die
jeweiligen Trigger in eure Map kopieren. Danach stehen euch neue
Funktionen/Variablen/Funktionalitäten zur Verfügung, die die libraries
beinhalten. Ich habe mir ein paar zusammengesucht, die meiner Meinung nach in
jeder Map nützlich sein können. Das Video stellt diese nun vor:

zum Anfang

Schlusswort

Zum Abschluss bleibt mir eigentlich nicht mehr viel zu
sagen. Ich hoffe es hat euch Spaß gemacht, das Tutorial zu "lesen"
und ihr seid nicht mehr so abgeschreckt, was Jass bzw. vJass anbelangt.
Natürlich ist man nach diesem Tutorial noch lange kein Meister der
multiplayertauglichen Zaubererstellung, aber ich denke trotzdem, dass es ein
paar Unklarheiten beseitigt hat und den einen oder anderen vielleicht sogar
motivieren konnte, auf vJass umzusteigen. Wer Spaß an dieser Art der Zaubererstellung
gefunden hat, den möchte ich gerne dazu anregen, auch seine Zauber in unserem Spell Forum
vorzustellen. Dort erhaltet ihr Feedback auf euren Code und eure Zauberidee
selbst und werdet auf Verbesserungen hingewiesen, um eure Codes noch
effizienter zu gestalten.

Für Anregungen oder Fragen, könnt ihr mir gerne eine private
Nachricht
zukommen lassen. Ich versuche, so schnell wie möglich darauf zu
antworten.

zum Anfang

Nützliche Links und Downloads

zum Anfang

  • 09.12.2010 um 23:24
Die Sieger des Replay of the Month August, September & Oktober! Hero Statistiken der SGNDT 2010

Von GUI zu vJass – Multiplayertaugliche Zauber!


Von GUI zu vJass – Multiplayertaugliche Zauber!

zum Anfang

Einleitung

Ein herzliches Willkommen zum inwarcraft.de Mapping Tutorial
"Von GUI zu vJass – Multiplayertaugliche Zauber!".

Dieses Tutorial wird auf die Probleme der
Multiplayertauglichkeit (kurz MUI) von
GUI Zaubern eingehen, eine kurze Schnelleinführung in Jass und Timer
anschneiden und am Ende eine vJass Lösung erarbeiten, mit der die Einfachheit
der Realisierung von MUI Spells mit vJass gezeigt wird. Ein optionales
Zusatzkapitel gibt es dann noch für diejenigen unter euch, die glauben alles
verstanden zu haben und soweit mit den Grundlagen vertraut zu sein, dass sie
schon einen nächsten Schritt wagen können. Für diese Mapper gibt es noch das

"Externe Systeme" Kapitel, das vier vJass Systeme einführen wird, die
die Zaubererstellung noch um ein Vielfaches einfacher gestalten und sogar noch
Probleme, die mit den standard Jass Funktionen auftreten, beheben werden. Doch…

zum Anfang

… bevor es losgeht …

brauchen wir natürlich noch ein paar wenige Tools, damit wir
auch besser arbeiten können und vJass auch wirklich nutzen können. Und dafür
benötigen wir das viel gefürchtete und allseits bekannte Jass Newgen Pack (kurz
JNGP). Ums kurz zu machen: JNGP ist sozusagen der World Editor 2.0. Er bietet
einige nützliche Zusatzfeatures, die der normale Editor nicht bietet, wie z.B.
das einfache Verschmelzen von unterschiedlichen Mapdaten oder einen
Tooltipgenerator, der es auf einfache Art und Weise ermöglicht, farbliche
Tooltips zu gestalten. Was jedoch noch viel wichtiger ist: Er verwendet einen
neuen Compiler für den Triggercode und ermöglicht somit die Nutzung von vJass.
Hinzu kommen noch angenehme Erweiterungen wie ein Codehighlighting oder eine
Textvervollständigung für Jassfunktionen, sodass man sich nicht jede Jass
Funktion auswendig merken muss. Das JNGP findet ihr hier. Damit ihr es auch
noch auf den neuesten Stand bringt, müsst ihr noch Jasshelper aktualisieren
(sozusagen der Compiler für unseren angehenden vJass Code). Wie die
Installation und das Updaten funktioniert, zeigt das folgende kurze Video:

Alles installiert und voller Enthusiamus stürzen wir uns
gleich ins nächste Kapitel, das den Zauber beschreibt, den wir realisieren
werden.

zum Anfang

Die Idee des Zaubers

Als Thema wollte ich mal
wieder etwas mit Gift veranstalten und da ich die Map im Felwood Tileset
erstellt habe, wurde es schließlich ein Zauber für Furion! Der Zauber markiert
alle feindlichen, nicht-toten Einheiten in einem 1000 Radius und markiert sie
mit einem "Poison Marker". Nach 3 Sekunden werden dann alle zuvor
markierten Ziele von einem Shadow Strike getroffen, sofern sie sich weiterhin
innerhalb des 1000 Radius von Furion befinden.

Abbildung 1: Tooltip des Zaubers

Abbildung 1: Tooltip des Zaubers

Somit ein feiner und kompakter Zauber, der perfekt zur
Veranschaulichung der Probleme mit MUI dienen wird. Bevor wir uns nun aber an
die Heranarbeitung der GUI Lösung wagen, werde ich noch kurz auf die nötigen
Objekte eingehen, die wir dafür erstellen müssen. Damit ihr das nicht alles
selbst per Hand lösen müsst, könnt ihr einfach die Musterlösungsmap
runterladen. Diese beinhaltet bereits diese Objekte.

Beim Anschauen des Videos behaltet nochmal die folgende Kurzfassung
des Zaubers im Hinterkopf:

Schritt 1) Wir
"markieren" alle Ziele in einem 1000 Radius um Furion mit einem "Poison Marker"

Abbildung 2: Die markierten Ziele erhalten einen Giftwolken
Effekt, der an ihrem Kopf haftet

Schritt 2) Wir warten 3 Sekunden

Schritt 3) Wir entfernen von allen markierten Zielen die
"Poison Mark" Fähigkeit

Schritt 4) Für jedes Ziel erstellen wir einen Dummy, der
Shadow Strike auf es zaubert, sofern es sich noch in einem 1000 Radius
befindet.

Abbildung 3: Die Wartezeit ist um und Shadow Strikes fliegen
auf die zulässigen Ziele

Hier nun also das Video, das die benutzten Objekte einführt:

zum Anfang

Die Objekteditor Objekte

Anmerkungen zum Video:

  • Den Bewegungstyp vom dummy könnte
    man auch auf None stellen, dadurch wird er auch nicht mehr von fliegenden
    Pathing-Blockern gestört.
  • Weiters wird das Anklicken des dummies schon
    dadurch verhindert, dass man ihm das Model None.mdl gibt. Dennoch wird Locust
    benötigt, um ihn auch vor den angesprochenen Pickschleifen zu schützen.
  • Der Radius von Tornado Aura(Slow) muss nicht
    unbedingt auf 0 gestellt werden, wenn als Ziele nur Self,Invulnerable und
    Vulnerable ausgewählt ist. Ebenso wird bei einem Radius von 0 weiterhin die
    Einheitenkollision berücksichtigt.

zum Anfang

Der GUI Ansatz

Nun aber genug mit dem Kinderkram – wir wollen Ergebnisse
sehen! Also starten wir mit einem ersten GUI Ansatz. Dies geschieht in
folgendem Video, das Schritt für Schritt die GUI Lösung erarbeitet. Wer sich
bereits gut genug mit GUI auskennt und glaubt, jede Kleinigkeit zu wissen, der
kann dieses Video gern überspringen und gleich zum nächsten Kapitel
weitergehen. Eine fertige Lösung findet ihr in der Musterlösungsmap in der
Kategorie "Die GUI Lösung".

Anmerkungen zum Video:

  • Wenn der Fog of War aktiv ist,
    kann es dazu kommen, dass dummies den Shadow Strike nicht zaubern, da sie das
    Ziel nicht sehen.
  • Wegen der Einfachheit wurde das Zauberlevel
    nicht vor dem Wait abgespeichert. Würde man innerhalb der 3 Sekunden Wartezeit
    die Fähigkeit leveln, wäre die Shadow Strike Fähigkeit der dummies
    fälschlicherweise um ein Level höher.
  • Das Leeren der Gruppe ist sinnlos. Dies ist eine
    falsch Aussage im Video, die ihr bitte vergessen solltet ;)

Nach endlosem Geklicke und lustigem Öffnen der
verschiedensten Fenster und Dialoge sind wir endlich soweit. Unser GUI Trigger
ist fertig! Voller Stolz und mit einem Kribbeln zwischen den Fingern wollen wir
natürlich sofort unseren neuen Prachtzauber testen und die Treants, die nur
mehr darauf warten, unseren Zauber ins Gesicht zu kassieren, nicht länger
warten lassen. Damit ihr euch den Spaß nicht im Gedanken ausmalen müsst, wird
es natürlich auch hierzu ein Video geben. Dieses Video sollte nicht
übersprungen werden, da es auf die Probleme eingehen wird, die mit unserem
Ansatz entstehen.

Nachdem wir nun in Aktion erleben durften, was alles schief
läuft, wenn wir den Zauber innerhalb der 3 Sekunden Wartezeit mehrmals zaubern,
werden wir uns noch einmal kurz den GUI Trigger durchdenken, wieso es ingame so
abläuft, wie es abläuft.

zum Anfang

GUI und seine Probleme

zum Anfang

Weg mit den Waits – Timer wir kommen!

Einige von euch wussten es vielleicht schon und wiederum
andere glaubten bis jetzt, dass sie mit Waits eine beliebige Wartezeit
einstellen können. Das dem nicht so ist, zeigt ein einfacher Test. Stellt die
Wartezeit unseres Zaubers auf 0 Sekunden und testet selbst, was passiert. Ihr
werdet feststellen, dass die Shadow Strikes nicht sofort nach dem Zaubern
erscheinen, sondern erst mit einer gewissen Verzögerung. Diese Verzögerung
beträgt ungefähr 0.25 Sekunden, was zugleich der minimalen Wartezeit eines
Waits entspricht. Dass dies natürlich kein erwünschtes Ergebnis ist, kann man
sich auch einfach vorstellen. Vielleicht kennt ihr bereits Zauber, die selbst
ein Geschoss erstellen und dieses periodisch fortbewegen. Würde man dies mit
Waits realisieren, hätte man eine Bewegung, die nur viermal pro Sekunde aktualisiert
wird, was recht ruckelig auf dem Bildschirm erscheint, wenn es ein schnelleres
Geschoss sein soll. Damit wir später aber auch Zauber mit einem Geschoss
realisieren können und immer eine ziemliche exakte Wartezeit, egal welche
Wartezeit wir wählen, erhalten, müssen wir auf Waits verzichten und auf ein
einfaches Hilfsmittel zurückgreifen – die Timer.

Sicherlich kennen ein paar von euch schon das periodische
Event in GUI, das die Triggeraktionen periodisch aufruft bzw. das Timed Elapsed
Event, das die Triggeraktionen nach einer gewissen Verzögerung ablaufen lässt.
Diese zwei Events sind im Prinzip nichts anderes als Timer. Ein Timer ist eine
Stoppuhr, die entweder einmal ablaufen kann oder immer wieder (=periodisch)
abläuft. Der Vorteil von Timern ist, dass sie keine wirkliche minimale
Wartezeit besitzen und somit DAS Mittel zum Zweck sind, wenn es um
Verzögerungen oder periodische Dinge geht. Wie wir nun Timer verwenden, zeigt
das folgende Crashkurs Video, in dem wir die Erstellung eines Jass Triggers
lernen werden und einen einfachen Trigger erarbeiten, der auf Timer
zurückgreift. Ebenso werden kurz die wichtigsten Neuerungen des JNGP im Bezug
auf den Triggereditor erklärt, die für das Benutzen von Jass/vJass essentiell
sind.

Anmerkungen zum Video:

  • der gg_ Präfix steht für generated
    global.
  • eine weitere gute Seite zum Nachschlagen von
    Informationen bezüglich Jass oder Jass Funktionen, ist http://jass.sourceforge.net/doc/

Abbildung 4: Auch mehrmaliges Drücken der Escape-Taste macht
unserem Trigger nichts aus

Für ein paar von euch dürfte dieser Teil ein ziemlich harter
Brocken gewesen sein. Deswegen empfehle ich an diesere Stelle eine kleine Pause
einzulegen, bevor ihr euch an das nächste Kapitel herantastet. Experimentiert
vielleicht noch ein bisschen mit Timern herum und der Erstellung der Jass
Trigger, bis ihr euch damit sicher fühlt. Ist dies der Fall, steht dem nächsten
Kapitel nichts mehr im Wege. Wir wissen, wie man einen Jass Trigger erstellt,
wir wissen wie wir Timer benutzen, auf zur nächsten Stufe – vJass!

zum Anfang

Die Magie – vJass und die Zaubererstellung

Wir haben mit Hilfe des Timer Beispiels nun ein wenig Jass
kennengelernt und vielleicht hat sich der ein oder andere mittlerweile auch
eines der Jass Einführungstutorials durchgelesen. vJass ist im Grunde genommen
nun nichts anderes als Jass. Es bietet lediglich einige Zuästze, die es
ermöglichen unseren Code übersichtlicher und strukturierter verwalten zu
können. Da vJass sehr viele Möglichkeiten bietet und es den Rahmen dieses
Tutorials sprengen würde, auf jede einzelne Kleinigkeit einzugehen, werde ich mich
hier auf das meiner Meinung nach wesentliche beschränken, das in Verbindung mit
Zaubererstellung benötigt wird. Dabei werde ich auf folgende Punkte näher
eingehen:

  • Gültigkeitsbereiche (scopes und libraries)
  • frei definierbarer global-Block
  • structs


Gültigkeitsbereiche

Zu aller erst – Was ist ein Gültigkeitsbereich?

Wenn wir uns an die vorangegangenen Videos erinnern, habe
ich euch ja erzählt, dass globale Variablen global verfügbar sind und in jedem
Trigger verwendbar, während hingegen lokale Variablen nur innerhalb der
Funktion, in der sie erstellt wurden, gültig sind. Der Gültigkeitsbereich einer
globalen Variable ist also global und der Gültigkeitsbereich einer lokalen
Variable ist lokal auf den Gültigkeitsbereich der Funktion beschränkt. vJass
bietet nun die Möglichkeit Funktionen und Variablen in einen selbst definierten
Gültigkeitsbereich zu verwalten. Dafür gibt es die Schlüsselworte scope und
library. Der Unterschied zwischen diesen zwei keywords ist ähnlich wie bei der
Einhaltung der Funktionsreihenfolge. Wenn wir uns an das Timer Beispiel
erinnern – dort habe ich erwähnt, dass Funktionen nur auf andere Funktionen
zugreifen können, die oberhalb definiert wurden. Die Funktion "weiß"
also nur von der Existenz anderer Funktion, die bereits "vorher"
erstellt wurden. Äquivalent ist das ganze mit scopes und libraries. Libraries
werden beim Abspeichern der Karte zuerst "abgearbeitet" und erst dann
scopes, d.h. scopes können auf jede beliebige library zugreifen, da der
librarycode oberhalb des scopecodes steht.

Ein weiterer Punkt in Verbindung mit Gültigkeitsbereichen sind
die keywords public (=öffentlich) und private (=privat). Innerhalb eines
Gültigkeitsbereiches kann man Funktionen, Variablen und Strukturen privat oder
öffentlich setzen. Alles was privat ist kann nur innerhalb des
Gültigkeitsbereiches verwendet werden. Alles was öffentlich ist, kann auch
außerhalb verwendet werden. Stellen wir uns z.B. einen Zauber Trigger vor, in
dem wir Schadenswerte pro Stufe und die ID der Zauberfähigkeit abspeichern.
Schadenswerte sollten nun nicht von außen manipulierbar sein, nicht dass wir
uns aus versehen in irgendeinem anderen Trigger reinpfuschen und unser Zauber
plötzlich Einheiten mit einem Schlag töten würde. Wir würden die Schadenswerte
also privat setzen. Anders könnt es bei der ID des Zaubers sein, diese könnte
auch außerhalb nützlich sein um z.B. Synergien mit anderen Fähigkeiten zu
realisieren. Somit wäre es eine gute Wahl, diese ID öffentlich zugänglich zu
machen.

Soviel zur Grundtheorie von Gültigkeitsbereichen. Ich werde
nun noch die Theorie von structs vorziehen, bevor es dann wieder ans Praktische
geht, und wir gemeinsam im Video den vJass Code für unseren Zauber erarbeiten.

Strukturen

Ebenso wie Gültigkeitsbereiche sind auch Strukturen eine
Möglichkeit unseren Code sauber und logisch zu verpacken. Wie der Name schon
vermuten lässt, ist eine Struktur irgendetwas, das aus den "Aufbau"
eines "komplexeren" Objekts beschreibt.

Wenn wir uns z.B. ein Auto anschauen, so besteht ein Auto
aus vier Reifen, einem Motor, besitzt einen Hersteller, usw.. Nun wäre es doch
toll, wenn man diese ganzen Daten zusammenfassen könnte auf ein Objekt und
dieses Objekt uns Methoden zur Verfügung stellt um das Auto zu verwalten/zu
manipulieren. Ein solches Objekt kennen wir alle, auch wenn es uns bis jetzt
vielleicht nicht bewusst war – eine warcraft Einheit! Diese hat eine gewisse
Anzahl Leben, eine Menge von Manapunkten, eventuell Fähigkeiten, usw.. Eine
Einheit können wir dann mittels Funktionen manipulieren. So können wir eine
Einheit töten, ihr Leben geben oder Fähigkeiten von ihr entfernen. Und genau
das bietet das vJass Feature struct. Mit einem struct können wir uns selbst
solche Objekte basteln und genau nach so etwas suchen wir doch? Ein Zauber soll
nämlich beispielweise unseren Zauberer beinhalten, die Stufe des Zaubers, die
Schadenswerte und Effekte des Zaubers, usw.. Wie das nun alles realisiert wird
und wie die oben genannten Punkte zusammenspielen wird das nächste Video
erarbeiten. Dort werden wir nun ein vJass Template für Zauber Trigger
erarbeiten.

Die Praxis – der vJass Zaubercode

zum Anfang

Externe Systeme

Hier nun noch ein paar Worte zu nützlichen libraries, die
euch interessieren könnten. Um libraries zu verwenden, müsst ihr einfach die
jeweiligen Trigger in eure Map kopieren. Danach stehen euch neue
Funktionen/Variablen/Funktionalitäten zur Verfügung, die die libraries
beinhalten. Ich habe mir ein paar zusammengesucht, die meiner Meinung nach in
jeder Map nützlich sein können. Das Video stellt diese nun vor:

zum Anfang

Schlusswort

Zum Abschluss bleibt mir eigentlich nicht mehr viel zu
sagen. Ich hoffe es hat euch Spaß gemacht, das Tutorial zu "lesen"
und ihr seid nicht mehr so abgeschreckt, was Jass bzw. vJass anbelangt.
Natürlich ist man nach diesem Tutorial noch lange kein Meister der
multiplayertauglichen Zaubererstellung, aber ich denke trotzdem, dass es ein
paar Unklarheiten beseitigt hat und den einen oder anderen vielleicht sogar
motivieren konnte, auf vJass umzusteigen. Wer Spaß an dieser Art der Zaubererstellung
gefunden hat, den möchte ich gerne dazu anregen, auch seine Zauber in unserem Spell Forum
vorzustellen. Dort erhaltet ihr Feedback auf euren Code und eure Zauberidee
selbst und werdet auf Verbesserungen hingewiesen, um eure Codes noch
effizienter zu gestalten.

Für Anregungen oder Fragen, könnt ihr mir gerne eine private
Nachricht
zukommen lassen. Ich versuche, so schnell wie möglich darauf zu
antworten.

zum Anfang

Nützliche Links und Downloads

zum Anfang

  • 09.12.2010 um 22:24
Die Sieger des Replay of the Month August, September & Oktober! RGBL: Halbfinalspiele am Sonntag