程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 【FOL】第六周,fol第六周

【FOL】第六周,fol第六周

編輯:Delphi

【FOL】第六周,fol第六周


最近太忙,三周(第四、五、六周)一起記錄一下。

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;

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved