Meine Herangehensweise war es, zu begrenzen, was mit Lua so viel wie möglich ausgesetzt ist. Ich habe nie eine Notwendigkeit für eine "Haupt" oder andere solche Funktion gefunden, die jedes Mal aufgerufen wird, wenn die Szene gerendert wird (oder mehr). Einige Lua-Engines (wie LOVE) tun dies jedoch. Ich bevorzuge es, Objekte mit optionalen Callback-Funktionen für häufige Ereignisse zu definieren, auf die das Objekt reagieren soll, wie etwa eine Kollision, ein Mausklick, das Betreten oder Verlassen der Spielwelt, etc.
Das Endergebnis ist sehr deklarativ, fast eine Konfigurationsdatei für Objekte. Ich habe eine Funktion zum Erstellen von Klassen oder Arten von Objekten und eine andere zum Erstellen von Objekten basierend auf diesen Typen. Die Objekte haben dann eine Sammlung von Methoden, die aufgerufen werden können, wenn auf verschiedene Ereignisse reagiert wird. Alle diese Lua-Methoden bilden C/C++ - Methoden ab, die wiederum die privaten Eigenschaften des Objekts modifizieren. Hier ist ein Beispiel eines Eimers Objekt, das Ball-Objekte erfassen können:
define {
name='ball';
texture=png('images/orb.png');
model='active';
shape='circle';
radius=16;
mass=1.0;
elastic=.7;
friction=.4;
}
define {
name='bucket';
model='active';
mass=1;
shape='rect';
width=60;
height=52;
texture=png('images/bucket.png');
elastic=.5;
friction=.4;
oncontact = function(self, data)
if data.subject:type() == 'ball' then
local a = data.subject:angleTo(self:getxy())
if a < 130 and a > 50 then
--update score etc..
end
end
end;
}
Ich würde das nicht nehmen, wie die „einzig wahre Weg“ Ihr Skript-API zu implementieren. Eine der Schönheiten von Lua ist, dass es viele verschiedene Arten von API unterstützt. Dies ist genau das, was ich gefunden habe, funktioniert gut für die Spiele, die ich mache - 2D Physik basierte Spiele.
Danke, ich mag deine Antwort sehr. Daher verwenden Sie Lua hauptsächlich als Konfigurationsdatei und Callback-Funktions-Repository. Und jedes Spielobjekt wird als C++ - Objekt und Lua-Objekt implementiert. Ist das korrekt? Wie synchronisieren Sie ihre Zustände? Wie speichern Sie das Spiel - generieren Sie eine neue Lua-Konfigurationsdatei? –
Die Lua-Objekte sind wirklich nur Interfaces, die Objekte in c über ein einziges lightuserdata-Feld abbilden, welches das "self" auflöst. Was das Speichern angeht, speichere ich im Allgemeinen nur das Niveau, auf dem ein Spieler ist, aber ich könnte eine Funktion implementieren, die den gesamten Spielzustand komplett in Lua wieder herstellt, indem man einfach den Status jedes Objekts erhält und dann ein Skript schreibt, um alle zu setzen - vielleicht nicht sehr optimiert und ich würde in diesem Fall wahrscheinlich Serialisierung betrachten. –