我的方法是儘可能限制接觸到Lua的內容。我從來沒有發現需要一個「主」或其他這樣的功能,每次場景渲染(或更多)時都會調用這個功能。然而,一些Lua引擎(如LOVE)會這樣做。我更喜歡使用可選的回調函數定義對象,以便您可能希望對象響應諸如碰撞,鼠標點擊,進入或離開遊戲世界等常見事件。
最終結果非常明確,幾乎是一個對象的配置文件。我有一個用於創建對象的類或類型的函數,另一個用於根據這些類型創建對象。然後這些對象擁有一系列可在響應各種事件時調用的方法。所有這些Lua方法都映射到C/C++方法,後者又修改對象的私有屬性。這裏是一個鬥對象,它可以捕捉球對象的示例:
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;
}
我不會以此爲「唯一正確的方法」來實現你的腳本API。 Lua的美女之一是它支持許多不同風格的API。這正是我所發現的遊戲非常適合我製作的遊戲 - 基於2D物理的遊戲。
謝謝,我非常喜歡你的答案。所以,你主要使用Lua作爲配置文件和回調函數庫。並且每個遊戲對象都被實現爲C++對象和Lua對象。那是對的嗎?你如何同步他們的狀態?你如何保存遊戲 - 生成一個新的Lua配置文件? – 2010-04-21 16:09:45
Lua對象實際上只是通過單個lightuserdata字段映射到c中的對象的界面,可解決「自我」的問題。至於保存我通常只保存一個玩家的等級,但是我可以實現一個函數,它完全在Lua中重新創建整個遊戲狀態,只需獲取每個對象的狀態,然後寫出一個腳本來設置它們全部 - 也許不會非常優化,我可能會在這種情況下看序列化。 – 2010-04-21 16:59:15