Für viele wird das Programmieren eventuell Neuland sein, für andere dagegen nur ein Unterschied in der Syntax zu anderen bereits bekannten Sprachen. Die Skriptsprache lua ist wie gesagt keine reine Programmiersprache, sondern versucht durch eine Vereinfachung der Syntax und der verwendeten Sprachelemente den Einstieg für den Benutzer zu vereinfachen. Um die Sprache anzuwenden benötigt man das Wissen über den Gebrauch der verschiedenen Sprachelemente. Wir wollen die Wichtigsten kurz aufzeigen und dazu erklären was sie ausdrücken.
- Variablen
- Operatoren
- Zuweisungen
- Vergleiche
- Funktionen
- Entscheidungsfragen
- Schleifen
- Zählschleifen
- Objekte
Variablen
In den meisten Programmen kommt man nicht ohne Variablen aus. Auch in lua sind diese daher enthalten. Variablen sind im Grunde Synonyme für Informationen. Die Informationen nkönnen dabei vielseitig sein. So ist es möglich einer Variablen einen Text zu zuweisen, oder eine Zahl. Ebenfalls kann eine Variable eine Tabelle darstellen, in der verschiedene Angaben eines Typs enthalten sind. Der Typ ist in lua aufgrund der Vereinfachung der Sprachelemente nicht explizit anzugeben. Der Typ wird somit eigenständig erkannt, ohne das man sich darum kümmern muss. Trotzdem sollte man wissen welche Typen es gibt:-
Boolean
Ein Typ zur Beschreibung eines Zustandes. Zustände können nur Wahr oder Falsch sein. Der Wert der Variablen ist entweder true(Wahr) oder false(Falsch).
Beispiel:VariablenName = true; -
String
Ein Typ zur Beschreibung von Text. Texte sind Ansammlungen von Zeichen. Der gesamte Text wird dabei von Hochkommatas eingeschlossen. Jedes Zeichen im Text ist als Char-Typ anzusehen.
Beispiel:VariablenName = “Dies ist ein String”; -
Tabelle
Dieser Typ kann mehrere Felder mit Informationen besitzen. Die Informationen werden entweder durch Numerierung oder durch den Namen des gewünschten Feldes angesprochen. Die Variable wird zum Ansprechen eines Feldes mit dem Namen der Variablen gefolgt von der Feldnummer oder dem Feldnamen(als String), welche sich in eckigen Klammern befinden, geschrieben.
Der Index der Tabelle beginnt immer bei 1!
Beispiel Deklaration:Beispiel Verwendung:VariablenName = { 2, 4, 8, 16 };
VariablenName = { Feld1 = “String eins”, Feld2 = “String zwei” };VarablenName[1];
VariablenNameFeld1; -
Zahl
Ein Typ zur Beschreibung einer Zahl. Die Zahl kann eine ganze Zahl sein oder auch eine reele Zahl. Ist der Wert negativ, wird vor die Zahl das Minuszeichen angehangen. Kommatas sind als Trennungszeichen nicht zulässig. Es muss immer ein Punktzeichen als Trennungszeichen verwendet werden!
Beispiel:VariablenName = -2.456;
Wie die Variablen behandelt werden hängt vor allem davon ab, wie sie deklariert werden. Es gibt zwei unterschiedliche Arten von Variablen:
-
globale Variablen
Diese Variablen gelten überall im Spiel und können auch von anderen Skripten verwendet werden. Meist sollten globale Variablen nur in Ausnahmefällen verwendet werden, um nicht Variablen des Spiels zu überschreiben/überlagern.
Für die Deklariation einer globalen Variable wird einzig der Name verwendet.VariablenName = Wert; -
lokale Variablen
Diese Variablen gelten nur in der Skript-Ebene in der sie deklariert werden. Lokale Variablen können globale Variablen überlagern, ohne die globalen Variablen in ihrem Inhalt zu verändern.
Lokale Variablen werden durch das Wort local vor dem Variablennamen gekennzeichnet.local VariablenName = Wert;
Lokale Variablen können sich ebenfalls überlagern, hier gilt die Regel: Die verwendete Variable ist die zuletzt deklarierte Variable.
VariablenName = Wert1;
– globale Variable mit Wert1
function FunktionX()
local VariablenName = Wert2 – lokale Variable “VariablenName” überlagert die globale Variable mit Wert2 (nicht überschrieben!)
if a == b then
local VariablenName2 = WertX; – lokale Variable nur bis “else” gültig
else
VariablenName2 = WertY; – “VariableName2″ unbekannt und wird, aufgrunder Zuweisung, zu einer globalen Variablen; bei einem Vergleich würde ein Fehler erzeugt werden
end
end
– ab hier ist wieder die globale Variable “VariablenName” gültig
function FunktionX()
local VariablenName = Wert2 – lokale Variable “VariablenName” überlagert die globale Variable mit Wert2 (nicht überschrieben!)
if a == b then
local VariablenName2 = WertX; – lokale Variable nur bis “else” gültig
else
VariablenName2 = WertY; – “VariableName2″ unbekannt und wird, aufgrunder Zuweisung, zu einer globalen Variablen; bei einem Vergleich würde ein Fehler erzeugt werden
end
end
– ab hier ist wieder die globale Variable “VariablenName” gültig
Operatoren
Operatoren sind besondere Zeichen(-Kombinationen), die bestimmte Aufgaben erfüllen sollen. Operatoren werden immer zwischen zwei Operanden gestellt mit Ausnahme des ” -” (für negative Zahlen) und dem ” not”Zum besseren Verständnis haben wir die Operatoren nach ihren Aufgabenbereichen unterteilt.
Rechenoperatoren
Es gibt insgesamt vier Rechenoperatoren. Diese lauten wie folgt:
-
+
Additionsoperator, um zwei Zahlen miteinander zu addieren.a + b = c; -
-
Subtraktionsoperator, um zwei Zahlen miteinander zu subtrahieren.x – y = z; -
*
Multiplikationsoperator, um zwei Zahlen miteinander zu multiplizieren.n * m = k; -
/
Divisionsoperator, um zwei Zahlen miteinander zu dividieren.i / j = s;
Vergleichsoperatoren
Auch in lua ist es möglich Werte miteinander zu vergleichen. Dabei werden die folgenden Vergleiche zur Verfügung gestellt:
- <
Der linke Wert muss kleiner sein als der rechte Wert. - >
der linke Wert muss größer sein als der rechte Wert. -
=
Der linke Wert muss kleiner sein oder dem rechten Wert entsprechen. -
=
Der linke Wert muss größer sein oder dem rechten Wert entsprechen. -
==
Der linke Wert muss dem rechten Wert entsprechen. -
~=
Der linke Wert darf nicht dem rechten Wert entsprechen.
Entspricht der Vergleich nicht dem angegebenen Operator fällt das Ergebnis negativ aus (falsch). Ist der Vergleich zutreffend, wird dagegen ein positives Ergebnis zurückgegben (richtig).
logische Operatoren
Logische Operatoren dienen dazu Operanden zu verknüpfen oder deren Aussage zu negieren. Folgende logische Operanden sind möglich
-
and
Der linke und der rechte Wert werden miteinander Verbunden. Beide Operanden müssen im Ergebnis wahr sein um ein positives (richtig) Endergebnis zu erhalten.k and m Ergebnis ist wahr, wenn k und m wahr sind -
or
Der linke und der rechte Wert werden miteinander Verbunden. Nur einer der beiden Operanden muss wahr sein um ein positives (richtig) Endergebnis zu erhalten.x or y Ergebnis ist wahr, wenn x oder y wahr ist -
not
Negiert das Ergebnis, welches nach dem Operator eingesetzt wird.not ( a = b) Ergebnis ist wahr, wenn a nicht kleiner gleich b ist
Stringoperatoren
Auch für Strings gibt es einen Operator. Der Operator ” ..” ermöglicht es, den Strings miteinander oder Werte an Strings zu knüpfen. Zahlenwerte werden durch den Operator automatisch in einen String umgewandelt.
“Dies ist der “..x..”-te Versuch”;
Ergebnis wenn x dem Wert 13 entspricht: “Dies ist der 13-te
Versuch”
Zuweisungen
Um Variablen zu füllen ist es notwendig ihnen Werte zuzuweisen. Eine Zuweisung wird durch das Zeichen = durchgeführt.VariablenName = Wert;
Will man einem Tabellenfeld einen Wert zuweisen muss das Tabellenfeld angesprochen werden.
VariablenName[i] = Wert;
– Tabellenfeld mit Indexnummer angesprochen
Vergleiche
Will man einen Wert mit einem anderen Wert vergleichen, so muss die Zeichenfolge ” ==” verwendet werden. Es ist sehr wichtig darauf zu achten, das man auf die Syntax bei einem Vergleich einhält und nicht ausversehen eine Zuweisung macht. Dies führt in den meisten Faeml;llen zu Fehlern im Skript, welche möglicherweise nicht im Spiel gemeldet werden.Wert1 == Wert2
Es ist meistens eher sinnvoll Variablen auf übereinstimmende Werte zu prüfen oder Variablen auf vordefinierte Werte.
VariablenName == Wert
VariablenName1 == VariablenName2
VariablenName1 == VariablenName2
Es wird in beiden Beispielen der Inhalt der Variablen verglichen, nicht der Name der Variablen.
Will man das genaue Gegenteil, untersuchen ob der eine Wert eben nicht dem anderen entspricht kann die Zeichenfolge ” ~=” verwendet werden. Dies bedeutet in der Umgangssprache ungleich. Entspricht der eine Wert nicht dem Anderen, so wird die Bedingung erfüllt.
VariablenName ~= Wert;
Funktionen
Um Skripte zu schreiben bedarf es Funktionen. Um Funktionen zu definieren reicht es aus das Wort function mit dem Funktionsnamen, gefolgt von zwei Klammern ( und ), aufzuschreiben. Die Funktion muss immer durch das Wort end beendet werden. Alles zwischen dem Anfang und dem Ende der Funktion wird als auszuführender Kode interpretiert.function FunktionsName()
– Funktionskopf
… – Inhalt der Funktion
end – Ende der Funktion
… – Inhalt der Funktion
end – Ende der Funktion
Parameter
Man kann einer Funktion auch Parameter anhängen die beim Aufruf der Funktion übergeben werden sollen. Die Angabe eines Parameters wird durch den Parameternamen zwischen den Klammern im Funktionskopf erreicht. Jeder Parameter wird als lokale Variable in der Funktion behandelt. Aufgrund der fehlenden Angabe des Parametertyps, sollte mit dem Aufrufer vorab geklärt werden welche Art von Parameter die Funktion erwartet.
Im Folgenden sieht eine Funktion mit N Parametern so aus:
function FunktionsName(ParameterName1,
ParameterName2, … ParameterNameN)
– Funktionskopf mit N Parametern
… – Inhalt der Funktion
end – Ende der Funktion
… – Inhalt der Funktion
end – Ende der Funktion
Rückgabewerte
Es ist ebenfalls möglich, daß die Funktion Werte an den Aufrufer zurückgibt. Hierfür ist das Wort return zu verwenden. Das Wort leitet eine umgehende Beendigung der Funktion ein. Soll die Funktion Werte zurückgeben, dann hängt man an das Wort die VariablenNamen oder die Werte an, getrennt durch Kommatas.
function FunktionsName()
– Funktionskopf mit N Parametern
… – Inhalt der Funktion
return “Dies ist das Ende”, VariablenName; – 2 Rückgabewerte liefern
end – Ende der Funktion
… – Inhalt der Funktion
return “Dies ist das Ende”, VariablenName; – 2 Rückgabewerte liefern
end – Ende der Funktion
Kommen wir nun zum Inhalt von Funktionen. Neben dem Aufruf von anderen Funktionen sind auch die Möglichkeiten gegeben, bestimmte Abläufe zu erzeugen.
Entscheidungsfragen
Will man Variablen miteinander Vergleichen oder einen festen Wert mit einer Variablen, so ist es meist von Vorteil eine Entscheidungsfrage zu stellen. Zu diesem Zweck ist die if-then-else Abfrage zu gebrauchen. Diese Abfrage entscheidet aufgrund der vorgegebenen Bedingung, ob der gewünschte Fall zutrifft oder nicht.if
Bedingung then Anweisung else optionale Anweisung end
Die Bedingung ist fast immer ein Vergleich. Die Anweisung ist eine Skript-Ebene höher als die Abfrage selbst. Lokale Variablen, die im Abschnitt Anweisung deklariert werden, sind nicht für den Abschnitt der optionalen Anweisung zugänglich.
Die Entscheidungsfrage kann erweitert werden, indem auf die else-Entscheidung eine weitere if-then-Abfrage gesetzt wird.
if
Bedingung1 then
Anweisung
elseif Bedingung2 then Optionale Anweisung 1
….
elseif BedingungN then
optionale Anweisung N-1
else
optionale Anweisung N
end
Anweisung
elseif Bedingung2 then Optionale Anweisung 1
….
elseif BedingungN then
optionale Anweisung N-1
else
optionale Anweisung N
end
Es ist ebenfalls möglich die Bedingungen innerhalb eines Bedingungsblockes zu verknüpfen. Folgende Verknüpfungsmöglichkeiten gibt es
-
and
Verknüpft eine vorhergehende und eine nachfolgende Bedingung zu einer. Es müssen beide Bedingungen zutreffen um die Gesamtbedingung zu erfüllen. -
or
Verknüpft eine vorhergehende und eine nachfolgende Bedingung zu einer. Es ist ausreichend wenn eine der beiden Bedingungen zutrifft um die Gesamtbedingung zu erfüllen.
if
Bedingung1 and Bedingung2 or Bedingung3 then — unklar was
zuerst geprüft werden soll
…
end
if (Bedingung1 and Bedingung2) or Bedingung3 then — Bedingung 1 und 2 muss zutreffen oder Bedingung 3
…
end
if Bedingung1 and (Bedingung2 or Bedingung3) then — Bedingung 1 und 2 muss zutreffen oder Bedingung 1 und 3
…
end
…
end
if (Bedingung1 and Bedingung2) or Bedingung3 then — Bedingung 1 und 2 muss zutreffen oder Bedingung 3
…
end
if Bedingung1 and (Bedingung2 or Bedingung3) then — Bedingung 1 und 2 muss zutreffen oder Bedingung 1 und 3
…
end
Zu guter Letzt muss noch erwähnt werden das die Bedingung auch negiert werden kann. Setzt man das Wort not vor die Bedingung, wird das Ergebnis der Bedingung negiert und erst danach die Entscheidung getroffen.
if not VariablenName == Wert then … end
Schleifen
Ab und An kann es durchaus passieren, daß man mehrere Durchgänge lang das gleiche machen will, mit nur ein wenig veränderten Werten. Zu diesem Zweck sind Schleifen sehr nützlich. Sie erlauben es den selben Code immer wieder zu durchlaufen, bis eine definierte Bedingung den Abbruch der Schleife erzwingt.Es gibt zwei Schleifenarten die man verwenden kann:
-
while-do
Die Schleife prüft immer zu Beginn, ob die Schleife abgebrochen werden soll oder nicht. Daher kann es auch sein, das es keinen einzigen Schleifendurchlauf gibt.while Bedingung do Anweisung end -
repeat-until
Die Schleife prüft immer am Ende, ob die Schleife abgebrochen werden soll oder nicht. Diese Schleife läft mindestens einmal durch.repeat Anweisung until Bedingung
Will man dagegen vorzeitig die Schleife verlassen, so verwendet man die Anweisung break;. Die Schleife wird vollständig verlassen.
Zählschleifen
Hat man eine feste Vorstellung von den Durchläufen die man benötigt um die Aufgabe zu erfüllen, so ist eine Zählschleife meist die erste Wahl.Zählschleifen fangen an einem angegebenen Startwert an und durchlaufen die Aufgaben so oft, bis das ebenfalls angebene Maximum erreicht wurde. Es ist möglich die Schrittweite des Zählens anzugeben. Normalerweise wird immer in Einerschritten gezählt, aber dies kann man durch eine optionale Angabe verändern.
for i=1,16 do
– Schleife von 1 bis 16, was 16 Durchläufen entspricht …
– Ausführung end
for i=16,5,-1 do – Schleife von 16 bis 5 herunterzählen, entspricht 12 Durchläufen … – Ausführung end
for i=1,16,2 do – Schleife von 1 bis 16 in Zweierschritten, entspricht 8 Durchläufen … – Ausführung end
for i=16,5,-1 do – Schleife von 16 bis 5 herunterzählen, entspricht 12 Durchläufen … – Ausführung end
for i=1,16,2 do – Schleife von 1 bis 16 in Zweierschritten, entspricht 8 Durchläufen … – Ausführung end
Wie bei den anderen Schleifen ist es auch hier möglich den aktuellen Schleifendurchlauf abzubrechen und zum nächsten zu springen ( continue;) oder die Schleife vollständig zu verlassen ( break;).
Objekte
Objekte sind komplexe Variablen, welche Eigenschaften und Funktionen besitzen können. Objekte sind für den AddOn-Programmierer in WoW fast ausschließlich XML-Elemente. Diese besitzen Eigenschaften die zur Laufzeit geändert werden können, meistens durch Funktionen des Elementes.Ein besonderes Objekt stellt die Variable this dar. Diese Variable entspricht immer dem aktuell zu Grunde liegenden Objekt. Das bedeutet, daß innerhalb einer Funktion, die durch ein XML-Element aufgerufen wird, this dem XML-Element entspricht.
Welche Funktionen des Objektes this man aufrufen kann, hängt vom XML-Element ab und sollte für den Programmierer erkenntlich sein, denn sonst kann es zu Fehlern kommen, weil die Funktion nicht bekannt ist.
Tipp: Tabellen können ebenfalls als Objekte angesehen werden
zurück zur AddOn-Materie
zurück zur Übersicht der Skript-Sektion
0













