Persönliche Werkzeuge

Structs im GUI

Aus Starcraft II Map-Editor Wiki

Wechseln zu: Navigation, Suche

Tutorials > Tutorials zum Auslöser-Editor > Structs im GUI
geschrieben von Kricz


Inhaltsverzeichnis

Vorwort

In diesem Tutorial zeige ich euch, wie Structs (welche aus der Programmiersprache C stammen) im GUI funktionieren und wie ihr diese benutzen könnt.


Was ist eigentlich ein Struct?

Ein Struct ist sozusagen eine Variable, welche verschiedene Variablen enthält. Dies kann man sich zB wie einen Ordner bei eurem Desktop oder so vorstellen. Hier ist der Ordner der Struct und die beinhaltenden Dateien sind die Struct-Member.

Wozu eignet sich in GUI überhaupt ein Struct?

Für mich selbst machen Structs Sinn, da diese zwar nicht als Parameter übergeben werden können, man diese aber Global machen kann und sie z.B. als eine Globale Variable (mit Array) speichern kann und so an eine Art objektbasierte Syntax kommen.


Wie erzeuge ich einen Struct?

Zuerst sollte man wissen, dass Structs im GUI nicht Struct heißen, sondern sie sind unter dem Namen "Record" zu finden. Um einen Record-Typ zu erstellen, öffnen wir zuerst einmal den Trigger-Editor und drücken STRG + U. Nun solltet ihr links in der Tabelle einen neuen Gegenstand haben, der "Untitled Record 001" heißen sollte. Ihr könnt ihn auch an der braunen Truhe als Bild erkennen. Nun habt ihr euren ersten Record erstellt. Dieser hat jedoch noch keine Variablen.


Um diesem Record Variablen hinzuzufügen, klickt ihr diesen zuerst einmal an. Rechts sollte sich dann etwas geöffnet haben, dass so aussieht:

 MyStruct

Variables


Indem ihr nun auf Variables klickt und STRG + W drückt, fügt ihr dem Record einen Member hinzu. Dieser kann jeden beliebigen Typ haben und sogar einen Array (ggf. auch mehrdimensional) und dazu einen Startwert. Ich habe meinem Record als Beispiel mal einen Integer hinzugefügt, der einen Array von 5 hat und den Startwert 3. Dies sollte dann ungefähr so aussehen:

 StructTest

Variables
StructMemberInt = 3 <Integer[5]>


Diesen Vorgang könnt ihr beliebig oft wiederholen und dem Record so viele Variablen zuordnen.

Der Einsatz von Records

Ich selber würde Structs für größere Sachen benutzen, wie z.B einen Dialog oder ähnliches. In diesem könnt ihr dann den Dialog und die ganzen benötigten DialogButtons speichern und so einfacher auf diese zugreifen. Bei einem Dialog eignet es sich dann auch, den Struct einmalig als eine globale Variable zu deklarieren. Ihr könnt den Struct jedoch auch als normale, lokale Variable benutzen, um z.B. die Positionen einer Einheit zu speichern. Dies würde einem das erzeugen von 3 Variablen (X, Y, Z) wegnehmen und es übersichtlicher machen.


Records als globale Variable

Um einen Record als globale Variable zu deklaieren, erstellt ihr erstmal wie gewohnt eine globale Variable und gebt dieser einen Namen. Nun wählt ihr diese an und sucht bei "Type:" den Namen "- Record" raus (das "-" muss dabei sein). Wenn ihr dies getan habt, wählt ihr unter dem Dialog euren Record-Typ aus und fügt diesem bei Bedarf einen Array hinzu. Records können nicht constant sein und können keinen Startwert haben! Nun habt ihr eine globale Variable eures Records erzeugt, welche ihr nun benutzen könnt.

Records als lokale Variable

Um einen Record als lokale Variable zu deklarieren, müsst ihr einfach eine lokale Variable erzeugen und wie bei einer globalen den Typ "-Record" auswählen und euren Record. Diesen könnt ihr dann wieder als Array angeben. Das ganze sollte dann so aussehen:

StructLocalTest

Events
Local Variables
------- ohne Array -------
MyStruct <StructTest>
------- mit Array -------
MyStructArray <StructTest[3]>
Conditions
Actions


Setzen von Variablen eines Records

Um die Variablen einen Records (auch bekannt unter "Member") zu ändern, macht ihr nichts anderes, als wenn ihr einer anderen Variable einen Wert zuordnen wollt. Ihr wählt die richtige Funktion dafür aus und nimmt als Variable euren lokalen oder globalen Record. Hier gibt es nur einen Unterschied: Im Gegensatz zu normalen Variablen müsst ihr hier zusätzlich einen Member auswählen:

    Variable - Set MyStruct.Member = Value

Der Member entspricht einfach der Variable innerhalb des Records, welche ihr ändern möchtet. Das Selbe gilt auch für das Lesen bzw. das Benutzen eines Records.

Zerstören/Recyclen von Records

Da lokale Records wie normale Variablen (Integer, String, Real usw.) behandelt werden, ist es nicht nötig, diese manuell zu zerstören oder zu recyclen, das macht Sc2 von alleine. Anders sieht dies jedoch mit den globalen Records aus. Diese bleiben das ganze Spiel über vorhanden und können auch nicht zerstört bzw recycled werden, was auch keinen wirklichen Sinn machen würde.

Was man über Records wissen sollte

Die Structs, welche hier als Records bekannt sind, sind NICHT die, die viele ehemalige oder aktive Wc3-Mapper aus vJass kennen. Die Structs, welche man aus vJass kennt, sind eher ganze Klassen und sollten nicht mit den Structs aus Galaxy verglichen werden. Die Struct in Galaxy sind nur dafür gedacht, normale Variablen zu sein und sie können auch nicht irgendwelche Interfaces oder andere Structs extenden! Solltet ihr an sowas interessiert sein, solltet ihr euch mal Andromeda von geX anschauen. Außerdem solltet ihr euch bei dem benutzen dieser Structs bewusst sein, dass diese WEDER als Parameter in Funktionen NOCH als Rückgabewert angegeben werden können.

Beispiel

Zuletzt hab ich noch ein kleines Beispiel eines kurzen Einsatzes eines lokalen Records gemacht:


Der Record:

 Vector

Variables
X = 0.0 <Real>
Y = 0.0 <Real>

Unit Position abfragen:

GetUnitPosition

Events
UI - Player Any Player presses F5 key Down with shift Allow, control Allow, alt Allow
Local Variables
MyStruct <Vector>
Conditions
Actions
Variable - Set MyStruct.X = (X of (Position of TestUnit))
Variable - Set MyStruct.Y = (X of (Position of TestUnit))
Debug - Display "Position of you unit:" as debug output using Type 1, and Do display it in the game window
Debug - Display ("X: " + (Text(MyStruct.X) with Any Precision decimal places)) as debug output using Type 1, and Do display it in the game window
Debug - Display ("Y: " + (Text(MyStruct.Y) with Any Precision decimal places)) as debug output using Type 1, and Do display it in the game window

Dies würde euch jedes mal wenn ihr F5 drückt die Position eurer TestUnit anzeigen.


Ich hoffe, dieses Tutorial hat euch ein wenig weiter geholfen und euch gezeigt, wie man Structs im GUI benutzen kann.

--Kricz 22:58, 9. Mai 2010 (UTC)

Autoren: Kricz , Peq