最近在做一款棋牌源碼的修復工作,一款常見的遊戲,水果拉霸。由於整個源碼是基於網狐的二次開發的,我以前也做過網狐二開,所以入手很快。不過這次的修復,前端稍微麻煩一點,我發現,前端與子游戲的後端是有一些不相符合的。所以依照遊戲的遊戲規則來修復遊戲.
最主要的是子游戲的服務端向客戶端傳送Lua,lua接受到socket消息後,lua把data轉換爲結構體。這裏是lua客戶端的代碼,在CMD_Game.lua子游戲中,
local SlotDef = {}
-- =========服務端數據==========
--空閒狀態
SlotDef.CMD_S_StatusFree = {
{k = "cbBetCount", t = "byte"},
{k = "lBetScore", t ="double", l={10}},
{k = "lPlayerScore", t ="double" },
{k = "lJackPot", t ="double" },
}
這裏k = cBetCount 爲結構體中的變量名稱,t=byte爲 數據類型,這樣,就定義好了一個結構體了
上面lua代碼的結構體,對應與C++的結構體爲:
//空閒狀態
struct CMD_S_StatusFree
{
//下注值
BYTE cbBetCount; //下注數量
SCORE lBetScore[10]; //下注大小
SCORE lPlayerScore; //玩家錢數
SCORE lJackPot; //獎金池
};
然後lua,在socket處,就可讀取data了:
下面的 dataBuffer 是socket讀取的buffer,然後通過函數 ExternalFun.read_netdata 讀取, ExternalFun是client->src->external->ExternalFun.lua.中的函數
local cmd_table = ExternalFun.read_netdata(SlotDef.CMD_S_StatusFree , dataBuffer)
然後就可以通過 cmd_table 使用其中的數據。
如獲取下注次數:
local betcount = cmd_table.cbBetCount
然後給出ExternalFun.read_netdata的源碼,這個應該可以在其他地方用到。
--[[
******
* 結構體描述
* {k = "key", t = "type", s = len, l = {}}
* k 表示字段名,對應C++結構體變量名
* t 表示字段類型,對應C++結構體變量類型
* s 針對string變量特有,描述長度
* l 針對數組特有,描述數組長度,以table形式,一維數組表示爲{N},N表示數組長度,多維數組表示爲{N,N},N表示數組長度
* d 針對table類型,即該字段爲一個table類型,d表示該字段需要讀取的table數據
* ptr 針對數組,此時s必須爲實際長度
** egg
* 取數據的時候,針對一維數組,假如有字段描述爲 {k = "a", t = "byte", l = {3}}
* 則表示爲 變量a爲一個byte型數組,長度爲3
* 取第一個值的方式爲 a[1][1],第二個值a[1][2],依此類推
* 取數據的時候,針對二維數組,假如有字段描述爲 {k = "a", t = "byte", l = {3,3}}
* 則表示爲 變量a爲一個byte型二維數組,長度都爲3
* 則取第一個數組的第一個數據的方式爲 a[1][1], 取第二個數組的第一個數據的方式爲 a[2][1]
******
]]
--讀取網絡消息
function ExternalFun.read_netdata( keyTable, dataBuffer )
local cmd_table = {};
--local cmd = cc.cCmd_Data:create()
--cmd:readscore(int64):getvalue()
--輔助讀取int64
local int64 = Integer64.new();
for k,v in pairs(keyTable) do
local keys = v;
------
--讀取數據
--類型
local keyType = string.lower(keys["t"]);
--鍵
local key = keys["k"];
--長度
local lenT = keys["l"];
local keyFun = nil;
if "byte" == keyType then
keyFun = function() return dataBuffer:readbyte(); end
elseif "int" == keyType then
keyFun = function() return dataBuffer:readint(); end
elseif "word" == keyType then
keyFun = function() return dataBuffer:readword(); end
elseif "dword" == keyType then
keyFun = function() return dataBuffer:readdword(); end
elseif "score" == keyType then
keyFun = function() return dataBuffer:readscore(int64):getvalue(); end
elseif "string" == keyType then
if nil ~= keys["s"] then
keyFun = function() return dataBuffer:readstring(keys["s"]); end
else
keyFun = function() return dataBuffer:readstring(); end
end
elseif "bool" == keyType then
keyFun = function() return dataBuffer:readbool(); end
elseif "table" == keyType then
cmd_table[key] = ExternalFun.readTableHelper({dTable = keys["d"], lentable = lenT, buffer = dataBuffer, strkey = key})
elseif "double" == keyType then
keyFun = function() return dataBuffer:readdouble(); end
elseif "float" == keyType then
keyFun = function() return dataBuffer:readfloat(); end
elseif "short" == keyType then
keyFun = function() return dataBuffer:readshort(); end
else
print("read_netdata error: key==>" .. key .. "; type==>" .. keyType);
end
if nil ~= keyFun then
cmd_table[key] = ExternalFun.read_datahelper({strkey = key, lentable = lenT, fun = keyFun});
end
end
return cmd_table;
end
以上就是lua讀取C++通過