铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 3862|回复: 3

[lua复刻] LUA版存储数据示例

[复制链接]
发表于 2010-12-15 10:03 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
本帖最后由 jy02785317 于 2010-12-15 16:50 编辑
  1. --LUA版存储数据示例
  2. --这仅仅只是一个很简单的例子,更多的可以参考游戏自己的存档读档函数
  3. --假设已经有4个变量,num1,num2,str1,str2
  4. --num1是无符号数,值是60000
  5. --num2是有符号数,值是-7
  6. --str1是"大家好"
  7. --str2是"HellowWorld"
  8. --数据存放于.\data\newrecord.data这个文件里
  9. --下面是存储部分
  10.         local data=Byte.create(44);        --括号里的数字是字节数,你需要根据你的需求自己算好,这里num1,num2都用双字节,str1,str2都用20字节
  11.                                                                                                 --无符号数双字节可以表示的范围0-65535,有符号数是是-32768~+32767,一个汉字需要两个字节,一个英文字符需要一个字节
  12.         Byte.setu16(data,0,num1);                --将num1存放于data的第0个位置,setu16是按16位(即双字节)存放无符号数,那么data的第0位和第1位就被写入数据了
  13.         Byte.set16(data,2,num2);                --将num2存放于data的第2个位置,set16是按16位(即双字节)存放有符号数,那么data的第2位和第3位就被写入数据了
  14.         Byte.setstr(data,4,string.len(str1),str1);        --将str1存放于data的第4个位置,string.len(str1)是用来计算str的长度,当然你也可以手动设置长度
  15.         Byte.setstr(data,24,string.len(str2),str2);        --没啥好说的,和上面一样
  16.         Byte.savefile(data,'.\\data\\ewrecord.data',0,44);        --上面的操作都是对内存操作,这一步才是将内存中的数据写入到实际的文件里去,0是写入位置,44是数据长度
  17.        
  18. --下面是读取部分
  19.         local data=Byte.create(44);
  20.         Byte.loadfile(data,'.\\data\\ewrecord.data',0,44);        --将文件中的数据加载到内存中
  21.         num1=Byte.getu16(data,0);
  22.         num2=Byte.get16(data,2);
  23.         str1=Byte.getstr(data,4,20);        --实际读取时,是不知道这个字符串会有多长的,所以全部读取
  24.         str2=Byte.getstr(data,24,20);
复制代码

评分

参与人数 1声望 +15 收起 理由
KA + 15 啊伟大的教程

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-12-15 13:00 | 显示全部楼层
本帖最后由 tsmdsyp 于 2010-12-15 14:09 编辑

七大最高!!!ありがどう ございます

[发帖际遇]: tsmdsyp抓了很多毒物给阿紫练功,获奖赏银两22两。


我真是晕死哦!表达下谢意还要被扣分!!!
这个本来就是我请七大写的

评分

参与人数 1声望 -5 收起 理由
KA -5 灌水

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-12-15 13:36 | 显示全部楼层
效率可能不怎么样吧。。频繁调用api
似乎还是读取到数组再进行进一步读取会快点?

[发帖际遇]: KA和韦小宝、瘦头陀、胡逸之赌牌九,瘦头陀耍赖,失去银两12两。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2010-12-15 13:41 | 显示全部楼层
本帖最后由 KA 于 2010-12-15 13:42 编辑

两种读取方法,你说哪个比较厉害点呢
求详细解释。。

JY_lua 0.66+

  1. -- 读取游戏进度
  2. -- id=0 新进度,=1/2/3 进度
  3. --
  4. --这里是先把数据读入Byte数组中。然后定义访问相应表的方法,在访问表时直接从数组访问。
  5. --与以前的实现相比,从文件中读取和保存到文件的时间显著加快。而且内存占用少了
  6. function LoadRecord(id)       -- 读取游戏进度
  7.     local t1=lib.GetTime();

  8.     --读取R*.idx文件
  9.     local data=Byte.create(6*4);
  10.     Byte.loadfile(data,CC.R_IDXFilename[id],0,6*4);

  11.         local idx={};
  12.         idx[0]=0;
  13.         for i =1,6 do
  14.             idx[i]=Byte.get32(data,4*(i-1));
  15.         end

  16.     --读取R*.grp文件
  17.     JY.Data_Base=Byte.create(idx[1]-idx[0]);              --基本数据
  18.     Byte.loadfile(JY.Data_Base,CC.R_GRPFilename[id],idx[0],idx[1]-idx[0]);

  19.     --设置访问基本数据的方法,这样就可以用访问表的方式访问了。而不用把二进制数据转化为表。节约加载时间和空间
  20.         local meta_t={
  21.             __index=function(t,k)
  22.                 return GetDataFromStruct(JY.Data_Base,0,CC.Base_S,k);
  23.                 end,

  24.                 __newindex=function(t,k,v)
  25.                 SetDataFromStruct(JY.Data_Base,0,CC.Base_S,k,v);
  26.                  end
  27.         }
  28.     setmetatable(JY.Base,meta_t);


  29.     JY.PersonNum=math.floor((idx[2]-idx[1])/CC.PersonSize);   --人物

  30.         JY.Data_Person=Byte.create(CC.PersonSize*JY.PersonNum);
  31.         Byte.loadfile(JY.Data_Person,CC.R_GRPFilename[id],idx[1],CC.PersonSize*JY.PersonNum);

  32.         for i=0,JY.PersonNum-1 do
  33.                 JY.Person[i]={};
  34.                 local meta_t={
  35.                         __index=function(t,k)
  36.                                 return GetDataFromStruct(JY.Data_Person,i*CC.PersonSize,CC.Person_S,k);
  37.                         end,

  38.                         __newindex=function(t,k,v)
  39.                                 SetDataFromStruct(JY.Data_Person,i*CC.PersonSize,CC.Person_S,k,v);
  40.                         end
  41.                 }
  42.         setmetatable(JY.Person[i],meta_t);
  43.         end

  44.     JY.ThingNum=math.floor((idx[3]-idx[2])/CC.ThingSize);     --物品
  45.         JY.Data_Thing=Byte.create(CC.ThingSize*JY.ThingNum);
  46.         Byte.loadfile(JY.Data_Thing,CC.R_GRPFilename[id],idx[2],CC.ThingSize*JY.ThingNum);
  47.         for i=0,JY.ThingNum-1 do
  48.                 JY.Thing[i]={};
  49.                 local meta_t={
  50.                         __index=function(t,k)
  51.                                 return GetDataFromStruct(JY.Data_Thing,i*CC.ThingSize,CC.Thing_S,k);
  52.                         end,

  53.                         __newindex=function(t,k,v)
  54.                                 SetDataFromStruct(JY.Data_Thing,i*CC.ThingSize,CC.Thing_S,k,v);
  55.                         end
  56.                 }
  57.         setmetatable(JY.Thing[i],meta_t);
  58.         end

  59.     JY.SceneNum=math.floor((idx[4]-idx[3])/CC.SceneSize);     --场景
  60.         JY.Data_Scene=Byte.create(CC.SceneSize*JY.SceneNum);
  61.         Byte.loadfile(JY.Data_Scene,CC.R_GRPFilename[id],idx[3],CC.SceneSize*JY.SceneNum);
  62.         for i=0,JY.SceneNum-1 do
  63.                 JY.Scene[i]={};
  64.                 local meta_t={
  65.                         __index=function(t,k)
  66.                                 return GetDataFromStruct(JY.Data_Scene,i*CC.SceneSize,CC.Scene_S,k);
  67.                         end,

  68.                         __newindex=function(t,k,v)
  69.                                 SetDataFromStruct(JY.Data_Scene,i*CC.SceneSize,CC.Scene_S,k,v);
  70.                         end
  71.                 }
  72.         setmetatable(JY.Scene[i],meta_t);
  73.         end

  74.     JY.WugongNum=math.floor((idx[5]-idx[4])/CC.WugongSize);     --武功
  75.         JY.Data_Wugong=Byte.create(CC.WugongSize*JY.WugongNum);
  76.         Byte.loadfile(JY.Data_Wugong,CC.R_GRPFilename[id],idx[4],CC.WugongSize*JY.WugongNum);
  77.         for i=0,JY.WugongNum-1 do
  78.                 JY.Wugong[i]={};
  79.                 local meta_t={
  80.                         __index=function(t,k)
  81.                                 return GetDataFromStruct(JY.Data_Wugong,i*CC.WugongSize,CC.Wugong_S,k);
  82.                         end,

  83.                         __newindex=function(t,k,v)
  84.                                 SetDataFromStruct(JY.Data_Wugong,i*CC.WugongSize,CC.Wugong_S,k,v);
  85.                         end
  86.                 }
  87.         setmetatable(JY.Wugong[i],meta_t);
  88.         end

  89.     JY.ShopNum=math.floor((idx[6]-idx[5])/CC.ShopSize);     --小宝商店
  90.         JY.Data_Shop=Byte.create(CC.ShopSize*JY.ShopNum);
  91.         Byte.loadfile(JY.Data_Shop,CC.R_GRPFilename[id],idx[5],CC.ShopSize*JY.ShopNum);
  92.         for i=0,JY.ShopNum-1 do
  93.                 JY.Shop[i]={};
  94.                 local meta_t={
  95.                         __index=function(t,k)
  96.                                 return GetDataFromStruct(JY.Data_Shop,i*CC.ShopSize,CC.Shop_S,k);
  97.                         end,

  98.                         __newindex=function(t,k,v)
  99.                                 SetDataFromStruct(JY.Data_Shop,i*CC.ShopSize,CC.Shop_S,k,v);
  100.                         end
  101.                 }
  102.         setmetatable(JY.Shop[i],meta_t);

  103.     end

  104.     lib.LoadSMap(CC.S_Filename[id],CC.TempS_Filename,JY.SceneNum,CC.SWidth,CC.SHeight,CC.D_Filename[id],CC.DNum,11);
  105.         collectgarbage();

  106.         lib.Debug(string.format("Loadrecord time=%d",lib.GetTime()-t1));
  107. end
复制代码
JY_lua 0.5

  1. -- 读取游戏进度
  2. -- id=0 新进度,=1/2/3 进度
  3. function LoadRecord(id)       -- 读取游戏进度

  4.     --读取R*.idx文件
  5.     local data=Byte.create(6*4);
  6.     Byte.loadfile(data,CC.R_IDXFilename[id],0,6*4);

  7.         local idx={};
  8.         idx[0]=0;
  9.         for i =1,6 do
  10.             idx[i]=Byte.get32(data,4*(i-1));
  11.         end

  12.     --读取R*.grp文件
  13.     data=Byte.create(idx[1]-idx[0]);              --基本数据
  14.     Byte.loadfile(data,CC.R_GRPFilename[id],idx[0],idx[1]-idx[0]);
  15.     LoadData(JY.Base,CC.Base_S,data);

  16.     JY.PersonNum=math.floor((idx[2]-idx[1])/CC.PersonSize);   --人物
  17.     data=Byte.create(CC.PersonSize);
  18.         for i=0,JY.PersonNum-1 do
  19.         Byte.loadfile(data,CC.R_GRPFilename[id],idx[1]+i*CC.PersonSize,CC.PersonSize);
  20.                 JY.Person[i]={};
  21.         LoadData(JY.Person[i],CC.Person_S,data);
  22.         end

  23.     JY.ThingNum=math.floor((idx[3]-idx[2])/CC.ThingSize);     --物品
  24.     data=Byte.create(CC.ThingSize);
  25.         for i=0,JY.ThingNum-1 do
  26.         Byte.loadfile(data,CC.R_GRPFilename[id],idx[2]+i*CC.ThingSize,CC.ThingSize);
  27.                 JY.Thing[i]={};
  28.         LoadData(JY.Thing[i],CC.Thing_S,data);
  29.         end

  30.     JY.SceneNum=math.floor((idx[4]-idx[3])/CC.SceneSize);     --场景
  31.     data=Byte.create(CC.SceneSize);
  32.         for i=0,JY.SceneNum-1 do
  33.         Byte.loadfile(data,CC.R_GRPFilename[id],idx[3]+i*CC.SceneSize,CC.SceneSize);
  34.                 JY.Scene[i]={};
  35.         LoadData(JY.Scene[i],CC.Scene_S,data);
  36.         end

  37.     JY.WugongNum=math.floor((idx[5]-idx[4])/CC.WugongSize);     --武功
  38.     data=Byte.create(CC.WugongSize);
  39.         for i=0,JY.WugongNum-1 do
  40.         Byte.loadfile(data,CC.R_GRPFilename[id],idx[4]+i*CC.WugongSize,CC.WugongSize);
  41.                 JY.Wugong[i]={};
  42.         LoadData(JY.Wugong[i],CC.Wugong_S,data);
  43.         end

  44.     JY.ShopNum=math.floor((idx[6]-idx[5])/CC.ShopSize);     --小宝商店
  45.     data=Byte.create(CC.ShopSize);
  46.         for i=0,JY.ShopNum-1 do
  47.         Byte.loadfile(data,CC.R_GRPFilename[id],idx[5]+i*CC.ShopSize,CC.ShopSize);
  48.                 JY.Shop[i]={};
  49.         LoadData(JY.Shop[i],CC.Shop_S,data);
  50.         end

  51.     local ll=filelength(CC.S_Filename[id]);
  52.     JY.S=Byte.create(ll);
  53.     Byte.loadfile(JY.S,CC.S_Filename[id],0,ll);

  54.     ll=filelength(CC.D_Filename[id]);
  55.     JY.D=Byte.create(ll);
  56.     Byte.loadfile(JY.D,CC.D_Filename[id],0,ll);

  57. end
复制代码
[发帖际遇]: KA于令狐冲口渴之时制止了其偷西瓜的行为,后得到岳不群的称赞,增加声望1。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-11-15 18:02

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表