偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

探索關(guān)于Lua自動(dòng)綁定系統(tǒng)問題

移動(dòng)開發(fā) iOS
本文著重說明Lua語言的綁定實(shí)現(xiàn)。這門技術(shù)能夠讓程序員將它們的C++類暴露給Lua,但不需要了解這個(gè)系統(tǒng)。

關(guān)于Lua自動(dòng)綁定系統(tǒng)問是本文要介紹的內(nèi)容,因?yàn)?strong>游戲內(nèi)容增長(zhǎng)的速度遠(yuǎn)遠(yuǎn)超過了以前,所以程序員已經(jīng)不能夠完全控制所有代碼行為了。他們需要其他游戲開發(fā)者的幫助。腳本語言在游戲里已經(jīng)被用了幾十年,但是現(xiàn)在的游戲機(jī)更能抓住它們的優(yōu)點(diǎn)來打打提高玩家的體驗(yàn)。

本精粹著重說明Lua語言的綁定實(shí)現(xiàn)。這門技術(shù)能夠讓程序員將它們的C++類暴露給Lua,但不需要了解這個(gè)系統(tǒng)。這里介紹的工具不僅能用在C++語言里,對(duì)其他語言也有效。這種設(shè)計(jì)的核心思想是易用性、效率、內(nèi)存占用和多線程的設(shè)計(jì)目標(biāo)來驅(qū)動(dòng)的。

1、介紹

在本精粹里介紹的綁定玉虛在Lua腳本里建立、訪問和使用C++對(duì)象。舉例來說,在一個(gè)singleton的類WORLD里保存了一個(gè)ENTITY類型的實(shí)力列表,下面的腳本就能夠用來設(shè)置玩家的生命值。

  1. local entity = WORLD:GetEntity("player")  
  2. entity:SetHealth(50) 

在這個(gè)例子里用到的綁定是由如下的聲明定義的。

  1. //in.h and class definition  
  2. SCRIPTABLE_DefineClass(WORLD)  
  3. //in.cpp  
  4. SCRIPTABLE_Class(WORLD)  
  5. {  
  6. SCRIPTABLE_ResultMethod1(GetEntity,ENTITY,std::string)  

綁定一個(gè)類就這么簡(jiǎn)單。不需要做其他任何步驟,允許程序員把C++類和自己的函數(shù)暴露給Lua,就這么簡(jiǎn)單。

2、特性

這個(gè)形同的設(shè)計(jì)目標(biāo)如下:

低內(nèi)存消耗;

高效率綁定;

支持C++的繼承;

使用方便;

在腳本與腳本之間保證線程使用的安全。

3、函數(shù)的綁定

Lua需要一個(gè)特別借口來綁定函數(shù)。被綁定的函數(shù)必須是下面代碼里定義的類型。Lua的綁定是基于堆棧的,lua_State包含了所有傳到那個(gè)函數(shù)里去的參數(shù)。這些參數(shù)必須通過使用堆棧索引號(hào) lua_to*來收集。在這個(gè)例子里,這個(gè)函數(shù)接受到的第一個(gè)參數(shù)是字符串,第二個(gè)參數(shù)是數(shù)字,返回值也是數(shù)字。關(guān)于C函數(shù)的綁定,你可以在Lua手冊(cè)[Ierusalimschy06]里找到更多的相關(guān)信息。C函數(shù)的綁定是Lua綁定到C/C++的唯一一個(gè)方法,也是這個(gè)系統(tǒng)的基礎(chǔ)。

  1. int bingding_method(lua_State* state)  
  2. {  
  3. const char* some_string;  
  4. double some_number,another_number;  
  5. some_string = lua_tostring(state,1);  
  6. some_number = lua_tonumber(state,2);  
  7. //在這里可以設(shè)置返回值,或者做點(diǎn)你需要做的事情  
  8. //另外一個(gè)數(shù)字  
  9. lua_pushnumber(state,another_number);  
  10. return 1;//假如說我們返回1  

4、在Lua里的面向?qū)ο?/p>

Lua是使用廣泛的一種編程語言,功能也很強(qiáng)大。本精粹介紹了如何把Lua變成一個(gè)面向?qū)ο蟮恼Z言。為了幫助大家用好這個(gè)功能,Lua的作者們定義了一系列的工具來給大家提供語法幫助(syntactic sugar)。下面列出我們?cè)诒鞠到y(tǒng)里使用的一個(gè)。在這段代碼里,the_object是一個(gè)初始的變量,這段代碼模擬了this_call的函數(shù)返回。

  1. the_object:Test(5)==the_object["Test"]( the_object,5) 

面向?qū)ο蟮姆椒梢允怯眠@種語法來實(shí)現(xiàn)。對(duì)象被當(dāng)做關(guān)系數(shù)組,用函數(shù)名來進(jìn)行索引,返回的就是你需要調(diào)用的函數(shù)。Lua里有一個(gè)機(jī)制,允許通過使用元表(metatable)來讓任何類型的變量對(duì)一個(gè)數(shù)組進(jìn)行交互(這事Lua5.1的特性。Lua5.0中只有表和用戶數(shù)據(jù)對(duì)象才有元表)。元表是Lua里的表,這個(gè)表被分配給一個(gè)對(duì)象,這個(gè)對(duì)象包含一些特殊的字段:_index, _newindex等([Ierusalimschy06])。在那些特殊字段里設(shè)置的函數(shù)會(huì)根據(jù)情況來被調(diào)用。當(dāng)一個(gè)對(duì)象被訪問時(shí),采取的如果是數(shù)組形式的訪問方式,_index就被調(diào)用了。下面的代碼說明了如何講一個(gè)元表設(shè)置到一個(gè)對(duì)象上。

  1. metatable = {}  
  2. metatable._ _index = function(table,key) return key end  
  3. setmetatable(object, metatable)  
  4. test_return = object["Test"] --在元表里面調(diào)用_index函數(shù) 

Lua的內(nèi)部函數(shù)類型有數(shù)字(double 或者float)、string、table、nil、function(Lua或C)、thread和(輕)用戶數(shù)據(jù)。我們采用最后一個(gè)類型在Lua里保存對(duì)象。輕用戶數(shù)據(jù)和用戶數(shù)據(jù)稍微有點(diǎn)不一樣。第二種完全是Lua對(duì)象,可以擁有一個(gè)元表。

5、在Lua里綁定C++對(duì)象

綁定需要幾個(gè)機(jī)制:在Lua重新描述C++對(duì)象、綁定函數(shù)的保存,最后是每個(gè)C++對(duì)象綁定數(shù)據(jù)的注冊(cè)。在本精粹里,我們先把整體的技術(shù)介紹給大家,稍后我們會(huì)講解一些特別的例子。

綁定數(shù)據(jù)結(jié)構(gòu)

在已經(jīng)存在的現(xiàn)實(shí)中,綁定是直接保存在Lua里面的,而相關(guān)的綁定數(shù)據(jù)就幫存在每個(gè)腳本里。但是如果系統(tǒng)必須支持的腳本數(shù)量很大,那么綁定數(shù)據(jù)就回不必要的被重復(fù)保存。為了避免這樣的情況發(fā)生,我們決定把綁定數(shù)據(jù)保存在C++中一個(gè)叫SCRIPTABLE_BINDING_DATA的類里。每個(gè)綁定的類都會(huì)被分配到一個(gè)索引值。

SCRIPTABLE_BINDING_DATA里包含一個(gè)記錄雷鳴和類的索引號(hào)的映射,它被保存在CLassIndexTable里。然后每個(gè)類都有個(gè)映射,記錄每個(gè)函數(shù)名和對(duì)應(yīng)的綁定函數(shù)。MethodTable是這種映射的重組,可以根據(jù)ClassIndex Table里的值進(jìn)行索引。因?yàn)閐elete操作符是沒有名字的,所以它的綁定被存放在單獨(dú)的數(shù)組里,這個(gè)數(shù)組叫做Delete Table。最后,Parent Table保存了每個(gè)類的弗雷的索引。如果某個(gè)類是沒有父類的,那么Parent Table的入口就被設(shè)置了 -1

在本書附帶光盤中,你可以找到一系列的副主函數(shù),這些輔助函數(shù)能夠讓你訪問這些映射。你可以在 scriptable_bingding_data.h文件里找到它們。

  1. class SCRIPTABLE_BINDING_DATA  
  2. {  
  3. typedef int(* BINDING_FUNCTION) (lua_State *);  
  4. std::map<std:string,int> 
  5. ClassIndexTable;  
  6. std::vector<std::map<std::string,BINDING_FUNCTION>*> 
  7. MethodTable;  
  8. std::vector<BINDING_FUNTION> 
  9. DeleteTable;  
  10. std::vector<int>;  
  11. ParentTable;  
  12. }; 

指向這個(gè)綁定數(shù)據(jù)的指針和之歌類的索引被存放在lua_State里。這個(gè)數(shù)據(jù)的空間是由luaconf.h里的LUAI_EXTRASPACE常量分配的。

小結(jié):探索關(guān)于Lua自動(dòng)綁定系統(tǒng)問題的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2021-08-23 10:14:20

鴻蒙HarmonyOS應(yīng)用

2019-08-26 09:15:04

Android數(shù)據(jù)庫安全

2011-08-24 16:59:59

LuaModule

2023-02-01 13:23:00

AI自動(dòng)化

2021-10-26 15:31:28

自動(dòng)駕駛技術(shù)安全

2011-08-31 16:06:50

LuaWeb開發(fā)

2011-08-25 15:51:10

Lua腳本

2011-08-23 15:34:56

Lua模式 匹配

2011-08-24 14:33:14

LUA開發(fā)環(huán)境Decoda

2011-08-25 17:25:55

LUADelphi

2011-08-29 16:37:21

Lua協(xié)同線程

2011-09-06 17:37:01

LUA應(yīng)用

2011-08-25 14:03:32

UbuntuLUA安裝

2011-08-24 14:14:13

LUA環(huán)境 配置

2009-11-25 09:00:20

無線路由器自動(dòng)撥號(hào)

2011-08-25 16:53:42

Lua數(shù)據(jù) 交換

2011-08-25 15:21:02

Lua字符串

2011-08-23 16:37:05

Lua數(shù)學(xué)庫

2011-08-24 15:34:44

MinGWLua環(huán)境配置

2011-08-23 17:33:08

LuaMetatable
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)