最近太忙,三周(第四、五、六周)一起記錄一下。
1、完成了鍵盤的輸入,順便把之前鼠標輸入改了一下(最早是在渲染循環裡面處理鼠標事件)
2、UI控件方面,做了個Edit控件,把之前的Label、Image、Button完善了一下
3、Delphi與lua方面的交互做了些修改,減少數據的多次處理,本來自己寫了個數據存取對象,後來也都統一改成用msgpack。
4、網絡方面,增加了一個gate服務器,客戶端加了個fol.net.gate的context。
5、業務方面,做了login、chat、mail、friend幾個模塊。
小結:這幾周還是在完善框架,重點是設計了服務端結構以及想清楚了客戶端與服務端的數據交互。
這裡分享一下Delphi讀取多層table的lua數據的代碼:
function TFOLNetScriptPackage.sendGateMsgData(L: lua_State): Integer; var lvRequireMsgcode, lvCallbackEventID: Integer; lvParamsTableName, lvParamName: string; lvParamCount, i, lvVType: Integer; lvMsgData: TSimpleMsgPack; begin { param_1 = lua.self(?, ignore), param_2 = requireMsgCode(integer), param_3 = callbackEventID(integer), param_4 = lua.tableName(string) param_5 = lua.data(table) lua.data = { [1] = {type=integer, name=string, value=string/integer/float/boolean}, [2] = {type=integer, name=string, value=string/integer/float/boolean}, [3] = {type=integer, name=string, value=string/integer/float/boolean}, ... } } lvRequireMsgcode:= lua_tointeger(L, 2); lvCallbackEventID:= lua_tointeger(L, 3); lvMsgData:= TSimpleMsgPack.Create; try lvParamsTableName:= lua_tostring(L, 4); lua_getglobal(L, PAnsiChar(AnsiString(lvParamsTableName))); lvParamCount:= lua_rawlen(L, -1); for i:= 1 to lvParamCount do begin //壓入主表的第i條記錄(一個table) lua_pushinteger(L, i); lua_rawget(L,-2); //壓入當前子表的第 1 個字段: type lua_pushstring(L, 'type'); lua_rawget(L,-2); lvVType:= lua_tointeger(L,-1); lua_pop(L, 1); //壓入當前子表的第 2 個字段: name lua_pushstring(L, 'name'); lua_rawget(L,-2); lvParamName:= lua_tostring(L,-1); lua_pop(L, 1); //壓入當前子表的第 3 個字段: value lua_pushstring(L, 'value'); lua_rawget(L,-2); case lvVType of ord(mptString) : lvMsgData.Add(lvParamName,lua_tostring(L,-1)); ord(mptInteger): lvMsgData.Add(lvParamName,lua_tointeger(L,-1)); ord(mptFloat) : lvMsgData.Add(lvParamName,lua_tonumber(L,-1)); ord(mptBoolean): lvMsgData.Add(lvParamName,Boolean(lua_toboolean(L,-1))); end; lua_pop(L, 1); //彈出本記錄(一個table),不然取不到下一條記錄 lua_pop(L, 1); end; gvNetManager.sendGateMsgData(lvRequireMsgcode,lvMsgData,lvCallbackEventID); finally FreeAndNil(lvMsgData); end; end;