2010-04-20 86 views
11

請幫助分類組織C++/Lua遊戲代碼的方法並分離他們的職責。什麼是最方便的方式,你使用哪一種?Lua和C++:職責分離

例如,Lua只能用於初始化C++對象或每次遊戲循環迭代。它也可以用於遊戲邏輯或圖形。一些遊戲引擎可以完全控制腳本中的所有子系統!我真的不喜歡這種方法(根本不分離)。

將所有遊戲對象(npc,locations)實現爲沒有C++對象的Lua表是不是一個好主意?或者最好鏡像它們(Lua表來控制C++對象)?或者是其他東西?

謝謝。

編輯。我的分類:Lua and C++: separation of duties

主題的延續:Lua, game state and game loop

回答

4

我的方法是儘可能限制接觸到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物理的遊戲。

+0

謝謝,我非常喜歡你的答案。所以,你主要使用Lua作爲配置文件和回調函數庫。並且每個遊戲對象都被實現爲C++對象和Lua對象。那是對的嗎?你如何同步他們的狀態?你如何保存遊戲 - 生成一個新的Lua配置文件? – 2010-04-21 16:09:45

+0

Lua對象實際上只是通過單個lightuserdata字段映射到c中的對象的界面,可解決「自我」的問題。至於保存我通常只保存一個玩家的等級,但是我可以實現一個函數,它完全在Lua中重新創建整個遊戲狀態,只需獲取每個對象的狀態,然後寫出一個腳本來設置它們全部 - 也許不會非常優化,我可能會在這種情況下看序列化。 – 2010-04-21 16:59:15

1

開始小。允許訪問遊戲實體,以便您可以執行地圖/級別特定的腳本。在地圖/級別上保持一致的行爲可能不需要腳本。

此外,只允許訪問您的對象的公共接口。

+0

謝謝你的第一個答案。說,將所有遊戲對象(npc,位置)實現爲沒有C++對象的Lua表是不是一個好主意?或者最好鏡像它們?或者是其他東西? – 2010-04-21 15:30:02

+0

我會用C++實現遊戲對象,但是用Lua實例化它們。在安裝過程中,您可以將屬性設置爲您希望它們適用於特定情況的屬性。您還可以爲您的Lua腳本設置回調,例如:如果打開door47,則調用Lua-function xyz。我建議你使用Lua作爲遊戲的「故事」,C++作爲機制。 – bitc 2010-04-21 17:11:09

2

我提出這個分類:

  1. 至尊變形:Lua腳本控制一切(遊戲邏輯,圖形,AI等)。甚至更多:腳本作爲主機程序工作,擁有遊戲循環。一些引擎做這樣的事情。巴 - 廣告:根本不分離職責,沒有腳本安全。

  2. Lua腳本保持遊戲狀態並處理遊戲邏輯。可能在每個遊戲循環迭代中都會調用腳本。

  3. Lua腳本很少用於初始化,配置和回調。主機程序爲腳本提供(綁定)非常簡約的接口。所以腳本是從這些精心設計和提供的模塊構建而成的。