[[http://www.siedler-games.de|{{:sg-link.jpg|}}]]
====== Funktionen (Jobs) ======
[[http://www.siedler-portal.de/vb3/sendmessage.php?do=mailmember&u=1172|Ritter Lanzelot ]] \\ \\
[[glossary:funktion|Funktionen]] und Jobs sind im weitesten Sinne eigentlich das Gleiche.
Eine Funktion beginnt mit der Zeile
function Name()
und endet mit dem
end
Also:
function Name()
end
--oder auch:
Name = function()
end
Theoretisch ist das schon eine fertige Funktion, allerdings macht das so keinen Sinn...
Eine sinnvolle Funktion ist zum Beispiel:
function CreateRaeuber()
RaeuberOne()
RaeuberTwo()
RaeuberThree()
StartSimpleJob("PruefungObRaeuberBandenTot")
end
--oder:
function CreateArmyZero()
local armyZero = {
player = 2,
id = 0,
strength = 4,
position = GetPosition("armyZero"),
rodeLength = 500,
};
SetupArmy(armyZero)
local troopDescription = {
maxNumberOfSoldiers = 4,
minNumberOfSoldiers = 0,
experiencePoints = LOW_EXPERIENCE,
leaderType = Entities.CU_Barbarian_LeaderClub2,
};
for i = 1, 4 do
EnlargeArmy(armyZero,troopDescription)
end
Defend(armyZero)
end
Eine Funktion wird allerdings erst dann ausgeführt, wenn sie im Spiel auch aufgerufen wird. Dies wird in den meisten Fällen innerhalb einer weiteren Funktion passieren.
Ein typisches Beispiel dafür ist die Funktion FirstMapAction(), welche vom Spiel (im Singleplayermodus) automatisch ausgeführt wird. In diese Funktion schreibt man nun Aufrufe für andere Funktionen wie zb.
CreatePlayer()
CreateArmyZero()
.....
Eine Funktion wird also mit Ihrem Namen und den Klammern aufgerufen. Sie wird dann genau einmal ausgeführt.
Will man, dass die Funktion regelmäßig (und zwar jede Sekunde) ausgeführt wird, ruft man sie als SimpleJob auf:
[[reference:startsimplejob|StartSimpleJob]]("CreateArmyZero").
Wie Ihr sehen könnt, wird der Name der Funktion hier als String übergeben, es werden auch die Klammern weg gelassen.
Übrigens: Funktionen, die jede 1/10-Sekunde ausgeführt werden, startet man mit einem sog. HiRes-Job, mit [[reference:startsimplehiresjob|StartSimpleHiResJob]]. Aber Vorsicht: SimpleHiResJobs können mitunter die Performance eines Rechners belasten und sollten deshalb ggf. nur kurze Zeit laufen.
\\
\\
Als Test für einen SimpleJob könnt Ihr ja mal folgendes machen:
Baut Euch eine kleine 64er Karte mit nix weiter drauf als einer XD_ScriptEntity mit dem Namen armyZero, kopiert die Funktion CreateArmyZero in das Script und ruft die Funktion in FirstMapAction auf. Wenn Ihr das Spiel startet, bekommt Ihr genau eine Armee.
Wenn Ihr jetzt aus dem Funktionsaufruf einen SimpleJob-Aufruf macht, bekommt Ihr jede Sekunde eine Armee.
Und das Ganze mit ein und der selben Funktion....
Nun sollte man allerdings aufpassen, dass man nicht zu viele Jobs gleichzeitig am Laufen hat, und Jobs, die keinen Sinn mehr machen, sollte man auch beenden.
Wenn man zBsp. mehrere Gegner im Spiel hat und fragt nun ständig für jeden Gegner gewisse Sachen ab :
Code:
function OpenPrison()
if IsDead("player2") then
DestroyEntity( "PrisonGate" )
ResolveBriefing(BriefingMonkMarker)
return true
end
end
dann sollte man den Job mit **return true** auch beenden, sobald die Bedingung erfüllt ist. In diesem Fall hier - wenn der Player2 tot ist und das "Gefängnis" geöffnet, brauche ich auch nicht mehr fragen.\\
\\
\\
Siehe auch
* [[reference:endjob|EndJob]]
* [[reference:jobisrunning|JobIsRunning]]
* [[reference:starthiresjob|StartHiResJob]]
* [[reference:startjob|StartJob]]
* [[reference:startsimplejob|StartSimpleJob]]
* [[reference:startsimplehiresjob|StartSimpleHiResJob]]
\\
\\
zurück zur Übersicht: [[:tutorials:index|Zur Tutorial-Übersicht]]