Guide zum Finden von Fehlern

[nocontentad]

Guide zum Finden von Fehlern

zum Anfang


1. Einleitung

Mein Ziel in diesem Tutorial ist es euch beizubringen, wie man Fehler effizient findet und ihr somit eure Maps
besser und schneller fertig bringt und so oft „sinnlose“ Threads dem Forum fern bleiben. Das Tutorial werde ich
mit ein paar Beispiel-(GUI-)Triggern füttern. Ihr seht, dass ich keine Jass Beispiele bringen werde. Die meisten
Sachen kann man eigentlich einfach auf Jass übertragen, also sollte das Tutorial auch für Jass’er geeignet
sein, denn die Methoden sind gleich.

Der Guide zeigt euch nur die Methoden, wie ihr Fehler finden könnt und das an Beispielen verdeutlicht. Ihr werdet
nie genau die Trigger wie hier haben. Aber er soll verschiedene Situationen zeigen, die sich oft ähneln. Ihr
müsst also euch selbst einen Kopf machen was ihr wo, wann und wie anwendet.


zum Anfang


2. Schneller Weg zum Ziel: Faselfehler vermeiden/finden

Oft sind es einfach Faselfehler, die einen einen ganzen Trigger lahm legen. Diese sind meist durch einfaches
ßberfliegen des Triggers zu finden und durch einfache Abläufe, die man oft im Spiel sieht. Sehen wir uns dazu
folgenden Trigger an:

Trigger 1 1
Events

Time – Elapsed game time is 1.00 seconds

Conditions
Actions

Unit – Create 1 Footman for Player 1 (Red) at Punktvariable facing Default building facing degrees
If (All Conditions are True) then do (Then Actions) else do (Else Actions)

If – Conditions

Spawncountervariable Less than 5

Then – Actions

Unit – Create 1 Knight for Player 1 (Red) at Punktvariable facing Default building facing degrees

Else – Actions

Do nothing

Set Spawncountervariable = (Spawncountervariable + 1)

Wir wollen einen Trigger erstellen, der uns jede Sekunden einen Footy an einem bestimmten Punkt, erstellt und
wenn davon 5 vorhanden sind, uns einen Ritter zur Verfügung stellt. Doch das ganze scheint nicht so recht zu
klappen, wir sehen nur einen Footy spawnen.

Schnell zu sehen, selbst für einen Laien, denn Time – Elapsed game time is 1.00 seconds wurde hier mit
Time – Every 1.00 seconds of game time verwechselt. Verändern wir also unseren Trigger wie folgt:

Trigger 1 2
Events

Time – Every 1.00 seconds of game time

Conditions
Actions

Unit – Create 1 Footman for Player 1 (Red) at Punktvariable facing Default building facing degrees
If (All Conditions are True) then do (Then Actions) else do (Else Actions)

If – Conditions

Spawncountervariable Less than 5

Then – Actions

Unit – Create 1 Knight for Player 1 (Red) at Punktvariable facing Default building facing degrees

Else – Actions

Do nothing

Set Spawncountervariable = (Spawncountervariable + 1)

Doch nun ist immernoch ein zweiter, häufiger Faselfehler, im Trigger enthalten. Eine Variable wird an der
falschen Stelle richtig gesetzt. Die Variable Spawncountervariable muss vor der Abfrage
hoch gesetzt werden, denn sonst würden erst 6 Footmens spawnen, bis ein Ritter das Spiel betritt. So was spielt
an vielen Stellen eine Rollen, aber nun denkt nicht, dass ihr einfach jeder Variable damit am Anfang des Trigger
setzt, einige müssen erst im Späteren Verlauf gesetzt werden. Also lautet unser Trigger endgültig:

Trigger 1 3
Events

Time – Every 1.00 seconds of game time

Conditions
Actions

Unit – Create 1 Footman for Player 1 (Red) at Punktvariable facing Default building facing degrees
Set Spawncountervariable = (Spawncountervariable + 1)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)

If – Conditions

Spawncountervariable Less than 5

Then – Actions

Unit – Create 1 Knight for Player 1 (Red) at Punktvariable facing Default building facing degrees

Else – Actions

Do nothing

Viele weitere Faselfehler sind z.B. das wählen der falschen Aktion, die falsche Bedingung (=, ≤, ≥,
≠ müssen auseinander gehalten werden!) und viele andere Sachen. Die einfachste Methode wäre das
ßberfliegen des Triggers und dem Verfolgen der Abläufe. Wenn das nichts helfen sollte, dann einfach das Programm
ausführen, gucken an was es haken kann und zu Not lässt man sich eine Textausgabe geben (dazu später mehr).

Ein weiterer häufiger Fehler ist, dass viele nicht wissen was der Unterschied zwischen den beiden Codefragmenten ist:

        (Var[A + 1])
        (Var[A] + 1)

Man sollte hier drauf achten, was man erreichen will. Ersteres dient dazu den Array in einer For each
Integer A
-Schleife um eins höher zu halten, als der Integer A ist. Ein praktisches Beispiel wäre das
füllen eines Multiboards, in dem man alle Spielerkills zeigen möchte, aber man die oberste Zeile mit Kills

beschriften will. Darum fängt man eins drunter an.
Das zweite ist im Prinzip einfach die Variable im Array A um eins erhöht. Dabei wird es sich oft um
Integer oder Real Variablen handeln. Das könnte man, um es auf das vorherige Beispiel zu beziehen,
nutzen, um die Spielerkills um eins zu erhöhen, wenn eine Figur getötet wurde.

Ihr könnt euch auch im Voraus diese

Seite durchlesen. Auf ihr stehen einige bekannte Fehler, die z.B. auch zu Editorabstürzen führen können.


zum Anfang


3. Methoden zum Finden von Fehlern

Wenn sich ein Fehler ereignet hat, dann empfiehlt sich folgendes zu tun:

  1. Text überfliegen:
    ßberfliegen des Textes und auf grobe Fehler achten (siehe Kapitel 2).
  2. Testen und beobachten:
    Man testet die Map und beobachtet an welcher Stelle der Fehler auftritt(siehe Kapitel 2), dabei ist zu
    beachten, das man seine Trigger kennen muss, wenn man einen Fehler sieht muss man wissen in welchem
    Trigger(-teil) etwas ausgeführt wurde, um sich auf den Teil zu fokussieren und ihn gründlicher zu
    untersuchen.

  3. Die Textausgabe:
    Mit der Textausgabe werden wir uns etwas genauer beschäftigen, da sie oft gebraucht wird und für das Finden von
    Fehlern oft unverzichtbar ist. Mit ihm lassen sich oft Fehler, die durch die Sichtkontrolle oder Testen nicht
    sichtbar sind, eingrenzen und aufspüren.

Als Einstiegsbeispiel nehmen wir folgenden Trigger:

Trigger 3 1
Events
Conditions
Actions

If (All Conditions are True) then do (Then Actions) else do (Else Actions)

If – Conditions

IntegerVariable Equal to 0

Then – Actions

Set Punkt = (Random point in (Playable map area))
Unit – Create 1 Footman for Player 1 (Red) at Punkt facing Default building facing degrees
Custom script: call RemoveLocation( udg_Punkt)

Else – Actions

If (All Conditions are True) then do (Then Actions) else do (Else Actions)

If – Conditions

IntegerVariable Equal to 1

Then – Actions

Set Punkt = (Center of (Playable map area))
Unit – Create 1 Footman for Player 1 (Red) at Punkt facing Default building facing degrees
Custom script: call RemoveLocation( udg_Punkt)

Else – Actions

Do nothing

Hier wollen wir einfach einen Footy erzeugen. Einmal, wenn IntegerVariable 0 ist, an einem zufälligen
Punkt auf der Karte und wenn selbige eins ist, dann genau in der Mitte.

Hinweis: Ihr könnt natürlich auch Unit – Create 1 Footman for Player 1 (Red) at
(Center of (Playable map area)) facing Default building facing degrees
schreiben, ich wollte nur zeigen,
wie man es gleich korrekt fast leakfrei schreibt. Gewöhnt euch das besser auch gleich an, mehr dazu findet ihr
in unserem Forum.

Doch nun unser Problem: der Trigger geht nicht! Ich schaue mir also den Trigger an und denke mir: „Es ist doch
alles richtig“. Manchmal liegt nur das Problem nicht im selben Trigger, sondern eventuell davor, wenn man die
IntegerVariable setzt. Um den Fehler zu finden könnte man sich jetzt die vorherigen Trigger angucken,
aber das tun wir erstmal nur indem wir sie überfliegen. Der Fehler muss ja nicht zwangsläufig hier liegen.
Dazu bauen wir uns einfach Folgendes am Anfang des Triggers ein:

        Spiel - Display to (All players) the text: (Integervariable hat den Wert: + (String(Integervariable)))

Nun sehen wir ob es daran liegen könnte. Wenn nicht müssen wir uns mit anderen Teilen beschäftigen und den
Aufbau überprüfen. Wenn es daran liegt, dann überprüfen wir alle Trigger, die die Variable ändern, auch mit
einer Textausgabe um zu sehen wo sie falsch gesetzt wird. Nun gibt es natürlich auch Trigger, die wie oben
aufgebaut sind, aber man nicht sieht welcher If-Then-Else-Anweisung man ist. Dazu braut man sich einfach
in jeden einzelnen then und else-Block eine Textausgabe rein, in der steht wo man sich grade
„befindet“. Dann vergleicht man das mit dem, wie es sein soll und hat so den Fehler auf eine If-Then-Else-Anweisung
beschränkt.

Wichtig ist, wenn man weiß in welchem Teil der Fehler liegt, dann fängt man mit den Methoden wieder von
vorne an. Lasst eurer Fantasie freien Lauf, ihr könnt Textausgabe wirklich überall verwenden. ßberlegt
euch einfach, woran es liegen kann, lasst es euch ausgeben und probiert alle Möglichkeiten durch.

Zusätzlich zur Textausgabe könnt ihr das ganze auch mit Punkten und Einheiten handhaben, indem ihr
Spezialeffekte an den Stellen einsetzt. Wenn ihr eure Punkte überdrüfen wollt, dann erstellt ihr an deren Stelle
zusätlich einen Spezialeffekt. Wenn eure Map sehr groß ist, könnt ihr zusätzlich an dem Punkt ein Signal auf der
Minimap erscheinen lassen. Bei Einheiten verhält sich das genau so, einfach ein Spezialeffekt an ihr erstellen
und zur Not ein Signal auf der Minimap geben lassen. Hier ein Beispiel:

Trigger 3 2
Events
Conditions
Actions

Unit – Create 1 Footman for Player 1 (Red) at (Random point in (Playable map area)) facing Default building facing degrees
Special Effect – Create a special effect attached to the overhead of (Last created unit) using Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl
Cinematic – Ping minimap for (All players) at (Position of (Last created unit)) for 1.00 seconds


zum Anfang


4. Was tun, wenn ich nichts finde?

Es gibt hier zwei konkrete Sachen, die man tun kann: Forum oder löschen. Bitte nehmt beide Methoden als letzte
Möglichkeit.

Die letzte Möglichkeit ist immer: löschen. So hart es klingt. Einfach löschen, neu machen und dazu noch
besser. Wenn ihr dann noch einen Fehler habt, überprüft eure ßberlegungen und versucht, wenn es nicht
geht, das ganze anders zu triggern.


zum Anfang


5. Fehlern vorbeugen

Um Fehler schon vorher zu vermeiden, solltet ihr euren Trigger planen. Entweder überlegt ihr euch im Kopf, was
er machen soll, wie ihr es bewerkstelligen wollt und was am Ende raus kommen soll oder ihr könnt euch das ganze
auch aufschreiben und mit einem Struktogramm verdeutlichen. (Dazu findet ihr hier mehr:
*klick*) ßberlegt euch
auch immer Mögliche Fehlerquellen, wie die Multiplayertauglichkeit. Hier sollte man drauf achten, dass es für
alle Spieler funktioniert und man so gut wie immer mit For each Integer A arbeiten muss. Ein
wichtiger Faktor, auch für die Fehlerfindung und die spätere fehlerfreie ßberarbeitung der Trigger (z.B.
Hinzufügen von Erweiterungen) ist, dass eure Trigger übersichtlich sind. Soll heißen, dass ihr euch Notizen
macht, die Trigger sinnvoll benennt, genau wie die Variablen. Das wird euch später viel Arbeit ersparen,
wenn ihr es gleich ordentlich macht. Jetzt mag der eine oder andere sagen: „Ich kenn doch meine Trigger, da
muss ich nichts beschriften“, ich hoffe ihr könnt das in 3 Monaten noch von allen Triggern behaupten.

Desweiteren gibt es Programme wie Grimoire mit denen sich Fehler finden und vorbeugen lassen. Ihr könnt eure
Maps testen und wenn euer WarCraft 3 crashen würde, regiert Grimoire darauf, indem es euch den Fehler als
Textnachricht anzeigt, wie wenn man z.B. durch 0 teilen will. Mehr Informationen darzu gibt es hier:
*klick*.


zum Anfang

6. Schlusswort

Als kleines Schlusswort möchte ich euch eigentlich nur 3 Dinge sagen.
Falsches Verhalten:
„Fehler in der Map hmmm… ach inwarcraft.de hat doch ein Forum, da geh ich mal hin und frage warum mein
Trigger nicht geht!“

Richtiges Verhalten:
„Ah ok, Raharu hat einen „Wie finde ich einen Fehler im Trigger Guide“ geschrieben, ich nehm ihn mal zur Hand
und gucke wie er es so macht, dann beschäftige ich mich eine gewisse Zeit mit dem Trigger und erst als vorletzte
Möglichkeit schreibe ich ins Forum.“
Bitte merkt euch das!

Desto länger ihr triggert, desto weniger Fehler werden euch passieren, „ßbung macht den Meister“.

Ich hoffe ihr habt beim Lesen was gelernt und werdet es anwenden. Noch viel Spaß beim Mappen!


zum Anfang


7. Weblinks

zum Anfang

  • 28.07.2008 um 20:38
Ansätze und Hilfen zur Lösung von komplexen Probleme Beseitigung von Memory-Leaks

Guide zum Finden von Fehlern

[nocontentad]

Guide zum Finden von Fehlern

zum Anfang


1. Einleitung

Mein Ziel in diesem Tutorial ist es euch beizubringen, wie man Fehler effizient findet und ihr somit eure Maps
besser und schneller fertig bringt und so oft „sinnlose“ Threads dem Forum fern bleiben. Das Tutorial werde ich
mit ein paar Beispiel-(GUI-)Triggern füttern. Ihr seht, dass ich keine Jass Beispiele bringen werde. Die meisten
Sachen kann man eigentlich einfach auf Jass übertragen, also sollte das Tutorial auch für Jass’er geeignet
sein, denn die Methoden sind gleich.

Der Guide zeigt euch nur die Methoden, wie ihr Fehler finden könnt und das an Beispielen verdeutlicht. Ihr werdet
nie genau die Trigger wie hier haben. Aber er soll verschiedene Situationen zeigen, die sich oft ähneln. Ihr
müsst also euch selbst einen Kopf machen was ihr wo, wann und wie anwendet.


zum Anfang


2. Schneller Weg zum Ziel: Faselfehler vermeiden/finden

Oft sind es einfach Faselfehler, die einen einen ganzen Trigger lahm legen. Diese sind meist durch einfaches
Überfliegen des Triggers zu finden und durch einfache Abläufe, die man oft im Spiel sieht. Sehen wir uns dazu
folgenden Trigger an:

Trigger 1 1
Events

Time – Elapsed game time is 1.00 seconds

Conditions
Actions

Unit – Create 1 Footman for Player 1 (Red) at Punktvariable facing Default building facing degrees
If (All Conditions are True) then do (Then Actions) else do (Else Actions)

If – Conditions

Spawncountervariable Less than 5

Then – Actions

Unit – Create 1 Knight for Player 1 (Red) at Punktvariable facing Default building facing degrees

Else – Actions

Do nothing

Set Spawncountervariable = (Spawncountervariable + 1)

Wir wollen einen Trigger erstellen, der uns jede Sekunden einen Footy an einem bestimmten Punkt, erstellt und
wenn davon 5 vorhanden sind, uns einen Ritter zur Verfügung stellt. Doch das ganze scheint nicht so recht zu
klappen, wir sehen nur einen Footy spawnen.

Schnell zu sehen, selbst für einen Laien, denn Time – Elapsed game time is 1.00 seconds wurde hier mit
Time – Every 1.00 seconds of game time verwechselt. Verändern wir also unseren Trigger wie folgt:

Trigger 1 2
Events

Time – Every 1.00 seconds of game time

Conditions
Actions

Unit – Create 1 Footman for Player 1 (Red) at Punktvariable facing Default building facing degrees
If (All Conditions are True) then do (Then Actions) else do (Else Actions)

If – Conditions

Spawncountervariable Less than 5

Then – Actions

Unit – Create 1 Knight for Player 1 (Red) at Punktvariable facing Default building facing degrees

Else – Actions

Do nothing

Set Spawncountervariable = (Spawncountervariable + 1)

Doch nun ist immernoch ein zweiter, häufiger Faselfehler, im Trigger enthalten. Eine Variable wird an der
falschen Stelle richtig gesetzt. Die Variable Spawncountervariable muss vor der Abfrage
hoch gesetzt werden, denn sonst würden erst 6 Footmens spawnen, bis ein Ritter das Spiel betritt. So was spielt
an vielen Stellen eine Rollen, aber nun denkt nicht, dass ihr einfach jeder Variable damit am Anfang des Trigger
setzt, einige müssen erst im Späteren Verlauf gesetzt werden. Also lautet unser Trigger endgültig:

Trigger 1 3
Events

Time – Every 1.00 seconds of game time

Conditions
Actions

Unit – Create 1 Footman for Player 1 (Red) at Punktvariable facing Default building facing degrees
Set Spawncountervariable = (Spawncountervariable + 1)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)

If – Conditions

Spawncountervariable Less than 5

Then – Actions

Unit – Create 1 Knight for Player 1 (Red) at Punktvariable facing Default building facing degrees

Else – Actions

Do nothing

Viele weitere Faselfehler sind z.B. das wählen der falschen Aktion, die falsche Bedingung (=, ≤, ≥,
≠ müssen auseinander gehalten werden!) und viele andere Sachen. Die einfachste Methode wäre das
Überfliegen des Triggers und dem Verfolgen der Abläufe. Wenn das nichts helfen sollte, dann einfach das Programm
ausführen, gucken an was es haken kann und zu Not lässt man sich eine Textausgabe geben (dazu später mehr).

Ein weiterer häufiger Fehler ist, dass viele nicht wissen was der Unterschied zwischen den beiden Codefragmenten ist:

        (Var[A + 1])
        (Var[A] + 1)

Man sollte hier drauf achten, was man erreichen will. Ersteres dient dazu den Array in einer For each
Integer A
-Schleife um eins höher zu halten, als der Integer A ist. Ein praktisches Beispiel wäre das
füllen eines Multiboards, in dem man alle Spielerkills zeigen möchte, aber man die oberste Zeile mit Kills

beschriften will. Darum fängt man eins drunter an.
Das zweite ist im Prinzip einfach die Variable im Array A um eins erhöht. Dabei wird es sich oft um
Integer oder Real Variablen handeln. Das könnte man, um es auf das vorherige Beispiel zu beziehen,
nutzen, um die Spielerkills um eins zu erhöhen, wenn eine Figur getötet wurde.

Ihr könnt euch auch im Voraus diese

Seite durchlesen. Auf ihr stehen einige bekannte Fehler, die z.B. auch zu Editorabstürzen führen können.


zum Anfang


3. Methoden zum Finden von Fehlern

Wenn sich ein Fehler ereignet hat, dann empfiehlt sich folgendes zu tun:

  1. Text überfliegen:
    Überfliegen des Textes und auf grobe Fehler achten (siehe Kapitel 2).
  2. Testen und beobachten:
    Man testet die Map und beobachtet an welcher Stelle der Fehler auftritt(siehe Kapitel 2), dabei ist zu
    beachten, das man seine Trigger kennen muss, wenn man einen Fehler sieht muss man wissen in welchem
    Trigger(-teil) etwas ausgeführt wurde, um sich auf den Teil zu fokussieren und ihn gründlicher zu
    untersuchen.

  3. Die Textausgabe:
    Mit der Textausgabe werden wir uns etwas genauer beschäftigen, da sie oft gebraucht wird und für das Finden von
    Fehlern oft unverzichtbar ist. Mit ihm lassen sich oft Fehler, die durch die Sichtkontrolle oder Testen nicht
    sichtbar sind, eingrenzen und aufspüren.

Als Einstiegsbeispiel nehmen wir folgenden Trigger:

Trigger 3 1
Events
Conditions
Actions

If (All Conditions are True) then do (Then Actions) else do (Else Actions)

If – Conditions

IntegerVariable Equal to 0

Then – Actions

Set Punkt = (Random point in (Playable map area))
Unit – Create 1 Footman for Player 1 (Red) at Punkt facing Default building facing degrees
Custom script: call RemoveLocation( udg_Punkt)

Else – Actions

If (All Conditions are True) then do (Then Actions) else do (Else Actions)

If – Conditions

IntegerVariable Equal to 1

Then – Actions

Set Punkt = (Center of (Playable map area))
Unit – Create 1 Footman for Player 1 (Red) at Punkt facing Default building facing degrees
Custom script: call RemoveLocation( udg_Punkt)

Else – Actions

Do nothing

Hier wollen wir einfach einen Footy erzeugen. Einmal, wenn IntegerVariable 0 ist, an einem zufälligen
Punkt auf der Karte und wenn selbige eins ist, dann genau in der Mitte.

Hinweis: Ihr könnt natürlich auch Unit – Create 1 Footman for Player 1 (Red) at
(Center of (Playable map area)) facing Default building facing degrees
schreiben, ich wollte nur zeigen,
wie man es gleich korrekt fast leakfrei schreibt. Gewöhnt euch das besser auch gleich an, mehr dazu findet ihr
in unserem Forum.

Doch nun unser Problem: der Trigger geht nicht! Ich schaue mir also den Trigger an und denke mir: „Es ist doch
alles richtig“. Manchmal liegt nur das Problem nicht im selben Trigger, sondern eventuell davor, wenn man die
IntegerVariable setzt. Um den Fehler zu finden könnte man sich jetzt die vorherigen Trigger angucken,
aber das tun wir erstmal nur indem wir sie überfliegen. Der Fehler muss ja nicht zwangsläufig hier liegen.
Dazu bauen wir uns einfach Folgendes am Anfang des Triggers ein:

        Spiel - Display to (All players) the text: (Integervariable hat den Wert: + (String(Integervariable)))

Nun sehen wir ob es daran liegen könnte. Wenn nicht müssen wir uns mit anderen Teilen beschäftigen und den
Aufbau überprüfen. Wenn es daran liegt, dann überprüfen wir alle Trigger, die die Variable ändern, auch mit
einer Textausgabe um zu sehen wo sie falsch gesetzt wird. Nun gibt es natürlich auch Trigger, die wie oben
aufgebaut sind, aber man nicht sieht welcher If-Then-Else-Anweisung man ist. Dazu braut man sich einfach
in jeden einzelnen then und else-Block eine Textausgabe rein, in der steht wo man sich grade
„befindet“. Dann vergleicht man das mit dem, wie es sein soll und hat so den Fehler auf eine If-Then-Else-Anweisung
beschränkt.

Wichtig ist, wenn man weiß in welchem Teil der Fehler liegt, dann fängt man mit den Methoden wieder von
vorne an. Lasst eurer Fantasie freien Lauf, ihr könnt Textausgabe wirklich überall verwenden. Überlegt
euch einfach, woran es liegen kann, lasst es euch ausgeben und probiert alle Möglichkeiten durch.

Zusätzlich zur Textausgabe könnt ihr das ganze auch mit Punkten und Einheiten handhaben, indem ihr
Spezialeffekte an den Stellen einsetzt. Wenn ihr eure Punkte überdrüfen wollt, dann erstellt ihr an deren Stelle
zusätlich einen Spezialeffekt. Wenn eure Map sehr groß ist, könnt ihr zusätzlich an dem Punkt ein Signal auf der
Minimap erscheinen lassen. Bei Einheiten verhält sich das genau so, einfach ein Spezialeffekt an ihr erstellen
und zur Not ein Signal auf der Minimap geben lassen. Hier ein Beispiel:

Trigger 3 2
Events
Conditions
Actions

Unit – Create 1 Footman for Player 1 (Red) at (Random point in (Playable map area)) facing Default building facing degrees
Special Effect – Create a special effect attached to the overhead of (Last created unit) using Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl
Cinematic – Ping minimap for (All players) at (Position of (Last created unit)) for 1.00 seconds


zum Anfang


4. Was tun, wenn ich nichts finde?

Es gibt hier zwei konkrete Sachen, die man tun kann: Forum oder löschen. Bitte nehmt beide Methoden als letzte
Möglichkeit.

Die letzte Möglichkeit ist immer: löschen. So hart es klingt. Einfach löschen, neu machen und dazu noch
besser. Wenn ihr dann noch einen Fehler habt, überprüft eure Überlegungen und versucht, wenn es nicht
geht, das ganze anders zu triggern.


zum Anfang


5. Fehlern vorbeugen

Um Fehler schon vorher zu vermeiden, solltet ihr euren Trigger planen. Entweder überlegt ihr euch im Kopf, was
er machen soll, wie ihr es bewerkstelligen wollt und was am Ende raus kommen soll oder ihr könnt euch das ganze
auch aufschreiben und mit einem Struktogramm verdeutlichen. (Dazu findet ihr hier mehr:
*klick*) Überlegt euch
auch immer Mögliche Fehlerquellen, wie die Multiplayertauglichkeit. Hier sollte man drauf achten, dass es für
alle Spieler funktioniert und man so gut wie immer mit For each Integer A arbeiten muss. Ein
wichtiger Faktor, auch für die Fehlerfindung und die spätere fehlerfreie Überarbeitung der Trigger (z.B.
Hinzufügen von Erweiterungen) ist, dass eure Trigger übersichtlich sind. Soll heißen, dass ihr euch Notizen
macht, die Trigger sinnvoll benennt, genau wie die Variablen. Das wird euch später viel Arbeit ersparen,
wenn ihr es gleich ordentlich macht. Jetzt mag der eine oder andere sagen: „Ich kenn doch meine Trigger, da
muss ich nichts beschriften“, ich hoffe ihr könnt das in 3 Monaten noch von allen Triggern behaupten.

Desweiteren gibt es Programme wie Grimoire mit denen sich Fehler finden und vorbeugen lassen. Ihr könnt eure
Maps testen und wenn euer WarCraft 3 crashen würde, regiert Grimoire darauf, indem es euch den Fehler als
Textnachricht anzeigt, wie wenn man z.B. durch 0 teilen will. Mehr Informationen darzu gibt es hier:
*klick*.


zum Anfang

6. Schlusswort

Als kleines Schlusswort möchte ich euch eigentlich nur 3 Dinge sagen.
Falsches Verhalten:
„Fehler in der Map hmmm… ach inwarcraft.de hat doch ein Forum, da geh ich mal hin und frage warum mein
Trigger nicht geht!“

Richtiges Verhalten:
„Ah ok, Raharu hat einen „Wie finde ich einen Fehler im Trigger Guide“ geschrieben, ich nehm ihn mal zur Hand
und gucke wie er es so macht, dann beschäftige ich mich eine gewisse Zeit mit dem Trigger und erst als vorletzte
Möglichkeit schreibe ich ins Forum.“
Bitte merkt euch das!

Desto länger ihr triggert, desto weniger Fehler werden euch passieren, „Übung macht den Meister“.

Ich hoffe ihr habt beim Lesen was gelernt und werdet es anwenden. Noch viel Spaß beim Mappen!


zum Anfang


7. Weblinks

zum Anfang

  • 28.07.2008 um 18:38
Map Design Tutorial Beseitigung von Memory-Leaks