Moje podejście polegało na ograniczeniu tego, co jest najbardziej narażone na Lua. Nigdy nie znalazłem potrzeby "głównej" lub innej takiej funkcji, która jest wywoływana za każdym razem, gdy scena jest renderowana (lub więcej). Niektóre silniki Lua (takie jak MIŁOŚĆ) robią to jednak. Wolę definiować obiekty z opcjonalnymi funkcjami wywołania zwrotnego dla typowych zdarzeń, na które obiekt może reagować, na przykład kolizja, kliknięcie myszą, wejście lub wyjście ze świata gry, itp.
Wynik końcowy jest bardzo deklaratywny, prawie plik konfiguracyjny dla obiektów. Mam funkcję tworzenia klas lub typów obiektów i inną dla tworzenia obiektów opartych na tych typach. Obiekty mają wtedy kolekcję metod, które można wywoływać podczas reagowania na różne zdarzenia. Wszystkie te metody Lua mapują na metody C/C++, które z kolei modyfikują prywatne właściwości obiektu. Oto przykład z obiektu wiadra, które mogą rejestrować obiekty kulowe:
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;
}
nie zajęłoby to jako „jedyną prawdziwą drogę”, aby wdrożyć skryptów API. Jednym z uroków Lua jest to, że obsługuje wiele różnych stylów API. Właśnie to znalazłem działa dobrze dla gier, które tworzę - gry oparte na fizyce 2D.
Dzięki, bardzo podoba mi się twoja odpowiedź. Używasz więc Lua głównie jako pliku konfiguracyjnego i repozytorium funkcji wywołania zwrotnego. A każdy obiekt gry jest zaimplementowany jako obiekt C++ i obiekt Lua. Czy to jest poprawne? Jak synchronizujesz ich stany? Jak zapisać grę - wygenerować nowy plik konfiguracyjny Lua? –
Obiekty Lua są tak naprawdę tylko interfejsami, które odwzorowują obiekty w c za pomocą pojedynczego pola lightuserdata, które określa, czym jest "self". Jeśli chodzi o zapisywanie, generalnie zapisuję tylko poziom, na którym znajduje się gracz, ale mogę wprowadzić funkcję, która odtwarza cały stan gry w całości w Lua, po prostu pobierając stan każdego obiektu, a następnie wypisując skrypt, aby ustawić je wszystkie - być może nie bardzo zoptymalizowany i prawdopodobnie spojrzę na serializację w tym przypadku. –