2014-04-21 172 views
0

好吧,讓我們說你用C++設計了一個遊戲,並且使用了lua以及該遊戲的C++部分與lua代碼的相互作用。我的主要問題是,我最難理解的是:編程語言如何與腳本語言交互?

  1. 是在編譯時轉換成C++對象的lua代碼嗎?

  2. lua代碼是否按照C++代碼的要求進行編譯?

  3. lua代碼依賴於C++代碼,就像它使用C++代碼中的函數一樣?

  4. lua代碼的內存與C++代碼中的內存集成在一起還是完全不同的進程。

+0

獲取Lua源代碼。參見'lua.c'作爲一個程序的例子,它通過創建一個Lua VM來嵌入Lua引擎,添加以C實現的庫,並編譯從控制檯讀取的Lua代碼。從某種意義上講,它一次只讀一行;大多數程序會一次讀取整個腳本。 –

+0

我同意湯姆,因爲使用StackOverflow播放20個問題不會讓您深入瞭解複雜主題 – Sqeaky

回答

0
  1. 被編譯時,Lua代碼轉換成C++對象?

    不,它被轉換成解釋器執行的指令。

  2. lua代碼是否按照C++代碼的要求進行編譯?

  3. 是對Lua代碼依賴於C++代碼,如在它使用從C++代碼功能?

    它可以但它不必。您可以決定從Lua獲得哪些c/C++變量和函數。

  4. lua代碼的內存與C++代碼中的內存集成在一起還是完全不同的進程。

    集成的,相同的過程。

3

對於4個問題的簡單答案:(1)否(2)是(3)可能(4)綜合。

多一點的討論雖然可能有所幫助。

Lua是一個用C編寫的解釋器,它將嵌入到您的應用程序中。 Lua有一個管理整個腳本執行狀態的lua_State結構,包含所有全局變量,局部變量等.Lua通過這個結構。你可以編寫C/C++代碼來操作這個lua_State結構,允許你添加腳本可以看到的全局變量......你也可以查詢lua_State結構來讀取由腳本設置的變量。除此之外,您還可以創建將執行Lua腳本函數的C/C++代碼,還可以編寫將C函數導出到Lua腳本的C/C++代碼,該代碼可以直接從腳本中調用。發生這種情況時,lua_State對象被傳遞給C函數,以便您可以讀取腳本引擎數據並根據需要修改腳本引擎數據。

通常用C/C++編寫的遊戲將實現一個處理所有渲染和其他時間關鍵項目部件的引擎。擁有引擎後,您可以創建C/C++代碼來創建相關對象來創建和控制遊戲。但是,您也可以將引擎API導出到Lua,然後創建Lua腳本來調用引擎API,以便在腳本中控制遊戲。

大多數情況下這是不期望的。您希望遊戲引擎保持對其執行方式的控制權,但您希望允許引擎在某些特定準則中進行擴展。爲此,大多數引擎將使用一種「回調」機制來添加Lua支持,其中游戲引擎被設計爲在某些時間點發出對某些Lua腳本函數的調用。例如。對於兩個對象之間的某種類型的碰撞可能會有回調,以允許用戶決定要做什麼。然後,Lua腳本可以根據需要更改對象狀態,例如根據需要爲爆炸效果產生新的對象。

一些引擎會爲每個調用創建並銷燬新的Lua實例(新的lua_State對象),這意味着您無法創建全局Lua變量並在調用之間保留它們,其他實例將使用相同的實例,因此您可以創建自己的全局Lua變量並與他們做你想要的。這取決於你的引擎編寫者。

將腳本添加到遊戲中意味着您只需考慮用戶如何能夠擴展引擎,並創建允許他們執行此操作的API,然後決定如何實現該功能。

+0

「Lua」,而不是「LUA」! –