Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level1:common_errors

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Nächste ÜberarbeitungBeide Seiten, nächste Überarbeitung
scripting:tutorials:level1:common_errors [2024/05/16 09:45] – angelegt fritz_98scripting:tutorials:level1:common_errors [2024/05/16 11:03] fritz_98
Zeile 1: Zeile 1:
 ======Häufige Fehler====== ======Häufige Fehler======
  
 +Wahrscheinlich wird dein Skript in seiner ersten Version Fehler enthalten. Damit du diese Fehler schneller einordnen und beheben kannst, sind hier Fehler gelistet, die häufig entstehen. Bei jedem Fehlertyp steht auch beschrieben, wodurch er verursacht werden könnte und wie man ihn behebt.
  
 ====Syntaxfehler==== ====Syntaxfehler====
  
-====Groß/Kleinschreibung====+Syntaxfehler sind Fehler, bei denen dein Skript gegen die "Grammatik" der Skriptsprache verstößt. Beispielsweise ist das Schreiben einen öffnenden Klammer und Auslassen einer schließenden Klammer ein Syntaxfehler. Die Fehlermeldungen im Debugger geben dir an, gegen welche Grammatikregel nicht eingehalten wurde und in welcher Zeile der Fehler passiert ist. Auch werden Syntaxfehler in Visual Studio Code **rot** markiert, sodass sie leicht zu finden sind. 
 + 
 +Einige Beispiele: 
 + 
 +===Das schließende Anführungszeichen fehlt=== 
 +<code lua> 
 +Message("Hallo Welt!) 
 +</code> 
 +Die Fehlermeldung: 
 +<code> 
 +unfinished string near `"Hallo Welt!)' 
 +</code> 
 + 
 +===Falsch verwendete Schlüsselwörter=== 
 +<code lua> 
 +if IsDead("Player2") do 
 +    Victory() 
 +end 
 +</code> 
 +Die Fehlermeldung: 
 +<code> 
 +`then' expected near `do' 
 +</code> 
 + 
 +===Komma im Table vergessen=== 
 +<code lua> 
 +local Briefing = { 
 +    { 
 +        title = "Mentor", 
 +        text = "Willkommen, mächtiger Anführer. Euer Mentor bin ich.", 
 +        position = GetPosition("Dario"
 +    } 
 + 
 +    { 
 +        title = "Mentor", 
 +        text = "Herr, mir scheint, Ihr habt da ein Komma vergessen!", 
 +        position = GetPosition("Dario"
 +    } 
 +
 +</code> 
 +Die Fehlermeldung: 
 +<code> 
 +expected (to close `{' at line 833) near `{' 
 +</code> 
 + 
 +Achte auf die Zeilenangabe im Debugger und die roten Markierungen in VSC! 
 + 
 +\\ 
 + 
 +====Groß-/Kleinschreibung==== 
 + 
 +Für Variablennamen wird zwischen Groß- und Kleinschreibung unterschieden. Sich da zu vertippen, wird Fehler verursachen. Zum Beispiel: 
 +<code lua> 
 +function FirstMapAction() 
 +    MyCounter = 1 
 +    IncreaseMyCounter() 
 +end 
 + 
 +function IncreaseMyCounter() 
 +    MyCounter = Mycounter + 1 
 +end 
 +</code> 
 + 
 +Die Fehlermeldung sieht dabei so aus: 
 +<code> 
 +attempt to perform arithmetic on global `Mycounter' (a nil value) 
 +</code> 
 + 
 +Sie drückt damit aus, dass versucht wurde mit einer globalen Variable namens ''Mycounter'' zu rechnen, die nicht existiert (also den Wert **nil** hat). 
 + 
 +Etwas Ähnliches kann dir auch mit Funktionsnamen passieren: 
 +<code lua> 
 +function FirstMapAction() 
 +    MyCounter = 1 
 +    IncreaseMyCounter() 
 +end 
 + 
 +function InCreaseMyCounter() 
 +    MyCounter = MyCounter + 1 
 +end 
 +</code> 
 +Die Fehlermeldung: 
 +<code> 
 +attempt to call global `IncreaseMyCounter' (a nil value) 
 +</code> 
 +Also wurde in dem Fall versucht, eine nicht existierende Funktion aufzurufen. 
 + 
 +Derartige Fehler werden in Visual Studio Code **gelb** unterstrichen. Wenn du mit der Maus über eine gelb hervorgehobene Variable fährst, sollte ''Undefined global'' angezeigt werden. 
 + 
 +===Spezialfall: SimpleJobs=== 
 + 
 +In SimpleJobs, wie beispielsweise für [[ scripting:tutorials:level1:simple_job |Sieg- und Niederlagebedingungen]], wird der Funktionsname als String angegeben. Wenn angegebener Job-Name und Funktionsname nicht gleich sind, ist das Resultat, dass der Job **ohne Fehlermeldung** nicht ausgeführt wird! Achte also insbesondere bei SimpleJobs darauf, dass die angegebenen Namen übereinstimmen, weil weder VSC noch der Debugger dich darauf hinweisen werden. 
 + 
 +\\ 
 + 
 +====Copy & Paste==== 
 + 
 +Fehler, die durch Copy & Paste entstehen, kommen selbst bei erfahrenen Programmierern immer wieder vor. Sie haben dabei nicht notwendigerweise eine Fehlermeldung zur Folge, sondern resultieren in unerwartetem Verhalten des Spiels. Oft vergisst man, notwendige Änderungen am kopierten Code vorzunehmen. 
 + 
 +Angenommen, du hast wie im Tutorial beschrieben, eine ''VictoryCondition'' definiert: 
 +<code lua> 
 +function VictoryCondition() 
 +    if IsDead("Player2") then 
 +        Victory() 
 +        return true 
 +    end 
 +end 
 +</code> 
 + 
 +Weil die ''DefeatCondition'' dazu sehr ähnlich ist, kopierst du die Funktion und machst entsprechende Änderungen: 
 +<code lua> 
 +function DefeatCondition() 
 +    if IsDead("Player2") then 
 +        Defeat() 
 +        return true 
 +    end 
 +end 
 +</code> 
 +Im Spiel hätte das zur Folge, dass der Spieler nicht verliert, wenn sein Haupthaus fällt. Außerdem kann es passieren, dass die Niederlagemeldung angezeigt wird, wenn er das feindliche Haupthaus zerstört hat. 
 + 
 +Anderes Beispiel: Du möchtest zwei gleich starke KI-Spieler für Spieler 2 und Spieler 3 definieren: 
 +<code lua> 
 +MapEditor_SetupAI(2, 2, 32000, 3, "Player2", 2, 0) 
 +MapEditor_SetupAI(2, 2, 32000, 3, "Player3", 2, 0) 
 +</code> 
 +In diesem Beispiel wird Spieler 3 nichts machen, weil vergessen wurde, den ersten Parameter mit der Spieler-Id zu ändern. Die Funktion prüft, ob an der angegebenen Position ein Gebäude des angegebenen Spielers steht. Ist das nicht der Fall, bricht die Funktion ab. 
 + 
 +Fehler durch Copy & Paste können vermieden werden, indem weniger Code dupliziert wird. Überlege dir, wie du dein Skript formulieren kannst, ohne dich allzu oft zu wiederholen. 
 + 
 +\\
  
 ====Variablennamen und Strings==== ====Variablennamen und Strings====
  
-====Copy/Paste====+\\
  
 ====Funktionsname und Funktionsaufruf==== ====Funktionsname und Funktionsaufruf====
 +
 +An verschiedenen Stellen ist es notwendig, Funktionen anzugeben, die beispielsweise als Reaktion auf ein bestimmtes Ereignis ausgeführt werden sollen. Ein häufig auftretendes Anwendungsbeispiel hierfür ist der ''finished'' Parameter in einem [[ scripting:tutorials:level1:briefings |Briefing]]. Die angegebene Funktion wird am Ende des Briefings aufgerufen.
 +
 +Die **Zuweisung** einer solchen Funktion darf nicht verwechselt werden mit dem **Aufruf** einer Funktion, der über sich öffnende und schließende Klammern definiert ist. Ein Beispiel:
 +<code lua>
 +-- Wir definieren eine Funktion, die eine Entity mit dem Skriptnamen "Dario" zu
 +-- einer Entity mit dem Skriptnamen "Player1" laufen lässt. Sinnvollerweise soll bei
 +-- diesem Beispiel "Dario" ein PU_Hero1c und "Player1" ein PB_Headquarters1 sein
 +function MoveDarioToHQ()
 +    Move("Dario", GetPosition("Player1"))
 +end
 +</code>
 +Vergleiche nun die folgenden beiden Briefings:
 +<code lua>
 +-- Variante 1
 +function BriefingMentor()
 +    local Briefing = {
 +        {
 +            title = "Mentor",
 +            text = "Dario, bitte begebt Euch umgehend zu Eurem Haupthaus!",
 +            position = GetPosition("Dario")
 +        },
 +
 +        finished = MoveDarioToHQ
 +    }
 +    StartBriefing(Briefing)
 +end
 +</code>
 +und
 +<code lua>
 +-- Variante 2
 +function BriefingMentor()
 +    local Briefing = {
 +        {
 +            title = "Mentor",
 +            text = "Dario, bitte begebt Euch umgehend zu Eurem Haupthaus!",
 +            position = GetPosition("Dario")
 +        },
 +
 +        finished = MoveDarioToHQ()
 +    }
 +    StartBriefing(Briefing)
 +end
 +</code>
 +
 +In Variante 1 wird Dario nach dem Briefing zu seinem Haupthaus gehen. In Variante 2 wird Dario **direkt zu Beginn** des Briefings zum Haupthaus gehen. Das liegt daran, dass im ''finished''-Parameter die Funktion ''MoveDarioToHQ'' **aufgerufen** wird. Der Rückgabewert der Funktion wird dann in ''finished'' eingetragen. Da in diesem Fall die Funktion keinen Wert zurückgibt, ist ''finished'' **nil**.
 +
 +\\
  
 ====Funktion nicht aufgerufen==== ====Funktion nicht aufgerufen====
 +
 +**Hinweis**: Unbenutzte //lokale// Variablen werden in VSC blasser dargestellt und sind daher leicht zu finden.
  
 ====SimpleJob nicht beendet==== ====SimpleJob nicht beendet====
scripting/tutorials/level1/common_errors.txt · Zuletzt geändert: 2024/05/16 14:30 von fritz_98