scripting:tutorials:level2:functions
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
scripting:tutorials:level2:functions [2023/09/09 11:53] – fritz_98 | scripting:tutorials:level2:functions [2024/05/17 10:02] (aktuell) – fritz_98 | ||
---|---|---|---|
Zeile 24: | Zeile 24: | ||
Es handelt sich dabei nur um eine alternative Schreibweise, | Es handelt sich dabei nur um eine alternative Schreibweise, | ||
- | Das gleiche Prinzip funktioniert auch, wenn ein Table als einziger Parameter erwartet wird. Wir definieren eine Funktion, die eine Person etwas sagen lässt: | + | Das gleiche Prinzip funktioniert auch, wenn ein Table als einziger Parameter erwartet wird. Wir definieren eine Funktion, die eine Person etwas sagen lässt |
<code lua> | <code lua> | ||
-- _WhoAndWhat ist ein Table, das eine Person und einen Text enthalten kann, aber nicht muss | -- _WhoAndWhat ist ein Table, das eine Person und einen Text enthalten kann, aber nicht muss | ||
Zeile 147: | Zeile 147: | ||
MaxResults = { Argmax{3, 25, 14, 9, 11, 17, 36} } | MaxResults = { Argmax{3, 25, 14, 9, 11, 17, 36} } | ||
</ | </ | ||
- | Der Wert '' | + | Der Wert '' |
+ | |||
+ | **Wichtig**: | ||
+ | Ein Beispiel für den letzteren Fall wird im Abschnitt zum Siedler-Skripting beleuchtet. | ||
+ | |||
+ | Lua selbst stellt auch Funktionen mit mehreren Rückgabewerten zur Verfügung. Die Funktion '' | ||
+ | <code lua> | ||
+ | FoundStart, FoundEnd = string.find(" | ||
+ | </ | ||
+ | '' | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ====Beispiele im Siedler-Skripting==== | ||
+ | |||
+ | Eine Funktion, die beim Siedler-Skripten häufig verwendet wird, ermittelt die Gebäude oder Einheiten eines bestimmten Typs des Spielers. '' | ||
+ | |||
+ | Darüber hinaus ist der erste Rückgabewert keine EntityId, sondern die Anzahl der gefundenen Ids! | ||
+ | |||
+ | In diesem Beispiel wollen wir 5 kleine Wohnhäuser von Spieler 1 zum Brennen bringen: | ||
+ | <code lua> | ||
+ | -- Maximal 5, potentiell 0 Entities im Table | ||
+ | local Player1Residences = { Logic.GetPlayerEntitites(1, | ||
+ | |||
+ | -- Die Iteration soll bei Index 2 beginnen, da an Index 1 keine EntityId, sondern die Anzahl der | ||
+ | -- gefundenen Häuser enthält | ||
+ | -- Die Iteration endet bei Player1Residences[1] + 1, da die Anzahl der gefundenen Häuser plus | ||
+ | -- jede einzelne EntityId zusammen die Länge der Liste bestimmen | ||
+ | -- Wenn keine Häuser gefunden wurden, ist Player1Residences[1] + 1 = 0 + 1 = 1 | ||
+ | -- Das bedeutet, dass mit i = 2, 1 der Block in der Schleife nie betreten wird | ||
+ | for i = 2, Player1Residences[1] + 1 do | ||
+ | -- Setze die Lebenspunkte herab, sodass das Haus zu brennen beginnt | ||
+ | SetHealth(Player1Residences[i], | ||
+ | end | ||
+ | </ | ||
---- | ---- | ||
Zeile 167: | Zeile 201: | ||
werden nur die ersten drei beachtet und addiert, der Rest verworfen. Die Funktion hat keine Möglichkeit, | werden nur die ersten drei beachtet und addiert, der Rest verworfen. Die Funktion hat keine Möglichkeit, | ||
- | Der Nutzen, den man daraus ziehen kann, ist eingeschränkt. Im Artikel zur [[ scripting: | + | Der Nutzen, den man daraus ziehen kann, ist eingeschränkt. Im Artikel zur [[ scripting: |
<code lua> | <code lua> | ||
local Numbers = {3, 25, 14, 9, 11, 17, 36} | local Numbers = {3, 25, 14, 9, 11, 17, 36} | ||
Zeile 218: | Zeile 252: | ||
Auch hier ist wieder zu beachten, dass zu wenige Argumente nicht per se als Fehler gelten und als Problemursache häufig versteckt auftreten. In unserem Beispiel mit der Summe können damit aber alle Parameter optional gemacht werden, sodass die nicht zwingend besetzt werden müssen. | Auch hier ist wieder zu beachten, dass zu wenige Argumente nicht per se als Fehler gelten und als Problemursache häufig versteckt auftreten. In unserem Beispiel mit der Summe können damit aber alle Parameter optional gemacht werden, sodass die nicht zwingend besetzt werden müssen. | ||
- | **Achtung**: | + | **Achtung**: |
Diesem Prinzip folgt beispielsweise die aus [[ scripting: | Diesem Prinzip folgt beispielsweise die aus [[ scripting: | ||
Zeile 264: | Zeile 298: | ||
=====Beliebig viele Parameter===== | =====Beliebig viele Parameter===== | ||
+ | |||
+ | In manchen Situationen ist es nützlich, eine Funktion mit beliebig vielen Parametern aufrufen zu können. Die Funktion soll dann einfach mit allen Parametern, die sie bekommt, arbeiten. | ||
+ | |||
+ | Ein Beispiel dafür kann eine Funktion sein, die aus allen Zahlen, die sie als Argumente erhält, eine Summe bildet. Auf herkömmlichem Weg kann man nur eine endliche Menge an Parametern definieren, die jederzeit überschritten werden kann. Zwangsläufig muss der Weg über Tables führen, die beliebig groß sein können: | ||
+ | <code lua> | ||
+ | function Sum(_Numbers) | ||
+ | local Result = 0 | ||
+ | for _, Number in ipairs(_Numbers) do | ||
+ | Result = Result + Number | ||
+ | end | ||
+ | return Result | ||
+ | end | ||
+ | |||
+ | print(Sum{3, | ||
+ | </ | ||
+ | |||
+ | Es gibt in Lua aber auch eine Schreibweise, | ||
+ | <code lua> | ||
+ | function Sum(...) | ||
+ | local Result = 0 | ||
+ | for _, Number in ipairs(arg) do | ||
+ | Result = Result + Number | ||
+ | end | ||
+ | return Result | ||
+ | end | ||
+ | |||
+ | -- Beachte den Unterschied zu oben: Hier wird kein Table als Argument überreicht, | ||
+ | -- hintereinander! | ||
+ | print(Sum(3, | ||
+ | </ | ||
+ | **Hinweis**: | ||
+ | |||
+ | Das lässt sich auch mit festen Parametern kombinieren. In der folgenden Beispielfunktion wollen wir in ein bestehendes Table alle angegebenen Werte einfügen: | ||
+ | <code lua> | ||
+ | MyTable = {3, 25, 14} | ||
+ | |||
+ | function MultiInsert(_Table, | ||
+ | for _, Value in ipairs(arg) do | ||
+ | table.insert(_Table, | ||
+ | end | ||
+ | end | ||
+ | |||
+ | MultiInsert(MyTable, | ||
+ | </ | ||
+ | Nach dem Aufruf hat '' | ||
+ | |||
+ | **Achtung**: | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Im nächsten Kapitel bleiben wir bei Funktionen und versuchen, mit Rekursionen zu arbeiten. | ||
+ | |||
+ | [[ scripting: | ||
+ | [[ scripting: | ||
+ | [[ scripting: |
scripting/tutorials/level2/functions.1694260427.txt.gz · Zuletzt geändert: 2023/09/09 11:53 von fritz_98