Hi, ich arbeite (mit C++ und SFML) an einem 2D Topdown Dungeoncrawler und bin nun soweit, dass ich eine minimale Lua-KI integriert habe. Die KI kann im Moment selbständig im Stehen angreifen (sie schwingt das Schwert erstmal nur durch die Luft
). Da das Gesamtsystem ein Entity-Component-System ist, habe ich entsprechend eine KI-Komponente erstellt, welche einen
AiState und einen Zeiger auf eine
Script Instanz besitzt. Dem Script wird beim Aufruf ein Zeiger auf den AiState mitgegeben; der State wird verwendet um zu wissen wer der Akteur ist (siehe unten, Variable
object). Weiterhin kapselt er Aktionen wie
attack() (um den eigentlichen Angriff auszulösen).
Ich habe im Moment folgendes Script:
|
Quellcode
|
1
2
3
|
onIdle = function(object)
object:attack()
end
|
Sobald der Angriff nach einigen Frames fertig ist, wird die KI darüber informiert und
onIdle erneut ausgelöst... Allerdings frage ich mich ob es so sinnvoll ist das Script zwischen KI-Instanzen zu teilen.
Meine Gedanken dazu:
- Prinzipiell ist es sinnvoll das Script zu teilen, damit nicht für 100 Objekte, die eigentlich das gleiche Script verwenden, entsprechend 100 Scripte im Speicher sind - eins reicht prinzipiell.
- Will ich, dass die KI sich "Sachen merkt" (zB die ID ihres Opfers, dem sie hinterher rennen will), wäre mein erster Ansatz das direkt im Lua abzulegen; effektiv als globale Variable. Dann teilen sich die KI-Instanzen aber auch diese globalen Variablen. Hätte ich pro KI-Instanz ein Script, hätte jeder seine eigenen globalen Variablen.
- Dann könnte ich noch im Script eine globale Table nehmen, hinter der sich pro Objekt das "Gemerkte" befindet. Der Akteur würde dann über seine eigene ObjectID an sein "Gedächtnis" kommen.
- Das "Gedächtnis" über den AiState zu realisieren halte ich für keine gute Idee. Zum einen wirkt das ganze relativ starr (AiState ist ja Teil des C++-Codes), und zum anderen... selbst wenn ich eine schön flexible Schnittstelle baue, müssen die Daten (die sich die KI merkt oder an die sie sich erinnert) bei jedem get und set kopiert werden. Vermutlich bin ich da mit nativen Lua-Variablen schneller.
Ich bin mir nicht so richtig sicher wie ich vorgehen sollte... Was meint ihr dazu? Oder hat jmd. sogar Erfahrungen mit dem Thema?
LG Glocke