铁血丹心

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

[不负责任的教程]新手DIY源码应用教程2.5 - “表”的定义和使用

  [复制链接]
发表于 2012-8-14 17:25 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 ivansz 于 2012-8-17 14:15 编辑

返回教程索引

看了不[负责任的教程]2.5的同学,可能会对新接触的一个词:“表”比较陌生,现在我就跟大家介绍一下“表”的定义与使用技巧。

1、定义表
1.1  格式
  1. local menu = {}  --定义一个空表 menu
复制代码

1.2  赋值
  1. menu = {1,2,3,4}  --为menu表赋值四个数字
  2. menu[5] = 5  --为menu表的第五个值赋值为5
  3. --上面两行赋值的结果会使menu的值变为{1,2,3,4,5},(这是最基本的赋值,下面会介绍更复杂的)
复制代码
1.2.1  特殊赋值(这只是我的叫法-..-)
特殊赋值这里要重点说明一下,其实在我们编写的LDCR.lua文件中表的应用是贯穿整个程序的。代码中经常见到的几个特殊赋值的表比如:JY.Person、WAR.Person、JY.Base 等等都是特殊赋值表。
  1. local person = {}  --举个例子,先定义一个表名为person
  2. person["生命"] = 1000  --赋值person表"生命"项的值为1000
  3. person["魔法"] = 2000  --赋值person表"魔法"项的值为2000
  4. --注意这里的"生命"和"魔法"只是我们随便定义的一个表,跟游戏数据没有关系
复制代码
1.2.2  多层表赋值
多层表是指两层或以上的表。例如JY.Person[0]["资质"] 就是一个二层表,它的第一层是数字0代表人物编号0也就是主角,第二层是特殊赋值的“资质”,调用的就是主角的资质。
  1. local kf = {} --先定义一个空表
  2. kf[1] = {"松风剑法","剑法","初级"} --为kf[1]赋值一个表{"松风剑法","剑法","初级"}
  3. kf[2] = {"狂风刀法","刀法","中级"}  --同上
  4. kf[2][3] = "初级"  --这样就把kf[2]的第三个值改为"初级"
  5. --经过上面的处理 kf 的值最终变为{{"松风剑法","剑法","初级"} ,{"狂风刀法","刀法","初级"}}
复制代码
1.2.3  赋值nil
nil是空值,也就是没有值。在某些情况下,需要给数据赋值nil来取消其赋值,也可以顺便释放内存。例如:
  1. kf[2] = nil --这样就把kf表的第二项{"狂风刀法","刀法","初级"}去掉了
复制代码


2、取值
取值就很简单了,我先介绍一个一个比较常用的函数:
QZXS(s)——其中的s需要是一个字符串,用于显示一段提示文字s在屏幕中央并等待玩家按任意键消失。
这个函数用来测试我们赋值是否正确。首先,请把上面的几段代码都复制进DIY.lua文件里。然后再继续加入下面的代码来测试取值。
  1. QZXS(""..menu[1]) --屏幕显示:1
  2. QZXS(""..menu[1]+menu[5]) --屏幕显示:6
  3. QZXS("生命 = "..person["生命"]) --屏幕显示:生命 = 1000
  4. QZXS(kf[1][1].."是"..kf[1][3]..kf[1][2]) --屏幕显示:松风剑法是初级剑法
  5. --上面代码中的""代表一个空字符串 .. 为字符串连接符 前两句为什么要加入 ""..呢 请各位同学思考一下。
复制代码

3、实例
学会表的赋值和取值之后,我们可以试着运用一下了。所有的实例都是在LDCR.lua内完成。
请大家准备好编辑工具。小二虽然已经推荐了Notepad++ ,但是我用的lua编辑器是luaEditor下载地址

好了,我们现在来试着山寨一个至尊版的“冰封系统”,这个在我的版本里都没有出现过。。。
冰封效果:
被冰封者需运功与寒气相抗,结果就是时序减内力(和流血时序减生命对应)。内伤越重,耗内越多。当冰封值大于一定值时,将进入“寒冰”状态,需消耗额外内力
冰封状态下集气速度减慢3点,寒冰状态减6点
冰封状态下九阴、先天时序回复无效
九阳解冰封速度加倍

由于是实例,我就只做第一个特效,冰封状态时序减内力,其他的以后有空再讲。

3.1  首先,冰封是一个状态,并且是每一个作战人员独立的状态。所以我们先定义一个“表”来储存冰封状态值,命名为WAR.ICE
在LDCR里搜索设置战斗全局变量 (红色标示搜索关键字)找到以下代码,并增加定义一个WAR.ICE表
  1. --设置战斗全局变量
  2. function WarSetGlobal()
  3.   WAR = {}
  4.   WAR.ICE = {}                --这是储存冰封值的表
  5.   WAR.ICEXS = {}  --这是判断是否显示冰封的表,下面3.5会用到
  6.   WAR.Data = {}
  7.   WAR.SelectPerson = {}
复制代码


3.2  定义表之后,我们就可以在战斗中调用它了。现在我们设置一个效果:主角攻击时有50%的几率冰封敌人
在LDCR里搜索流血计算就在他的上一行添加代码(其实是加在War_WugongHurtLife(emenyid, wugong, level, ang) 这个函数里)
  1. if pid == 0 and JLSD(0,50,pid) then  --如果pid(攻方)是主角,并且50%几率这个JLSD二宫讲过了我就不讲了
  2.   WAR.ICE[eid] = (WAR.ICE[eid] or 0) + math.modf(hurt/10)  --受方的冰封值增加所受伤害的十分之一
  3.   WAR.ICEXS[eid] = 1  --表示该敌人本次攻击被冰封,下面3.5会用到
  4.   if WAR.ICE[eid] > 100 then  --如果受方冰封值大于100,就让它等于100。也就是控制一下冰封的最大值
  5.     WAR.ICE[eid] = 100
  6.   end
  7. end

  8. --流血计算

  9. --注意:第二行中的(WAR.ICE[eid] or 0) 也许大家很难理解,其实这是一个防跳出的措施,如果WAR.ICE[eid]为空值就取值0,因为空值是不能计算的,所以要加上一个 “or 0”并打上括号3.3  给予敌人冰封状态之后,就要做这个冰封减内效果了
复制代码


3.3  做冰封减内效果,
搜索九阳神功回内,还是加代码在其上面一行(其实是加在DrawTimeBar()这个函数里)
  1. if WAR.ICE[jqid] ~= nil then  --如果集气人物id的冰封值不为空
  2.   --其内力每时序减少(1-3点在加上受伤程度除以15)
  3.   JY.Person[jqid]["内力"] = JY.Person[jqid]["内力"] - math.random(3) - math.modf(JY.Person[jqid]["受伤程度"] / 15)
  4.   if WAR.ICE[jqid] > 70 then  --如果冰封程度大于70,则进入寒冰状态,时序减内翻倍。
  5.     JY.Person[jqid]["内力"] = JY.Person[jqid]["内力"] - math.random(3) - math.modf(JY.Person[jqid]["受伤程度"] / 15)
  6.   end
  7.   WAR.ICE[jqid] = WAR.ICE[jqid] - 1  --每时序减少一点冰封值
  8.   if PersonKF(jiqid,106) then  --如果练了九阳神功,则时序回冰封翻倍
  9.     WAR.ICE[jqid] = WAR.ICE[jqid] - 1
  10.   end
  11.   if WAR.ICE[jqid] <= 0 then  --如果冰封值小于等于0
  12.     WAR.ICE[jqid] = nil  --把他清空
  13.   end
  14. end

  15. --九阳神功回内 --只有冰封值为空 才可以九阳回内
  16. if WAR.ICE[jqid] == nil and PersonKF(jqid, 106) and (JY.Person[jqid]["内力性质"] == 1 or jqid == 0 and GetS(4, 5, 5, 5) == 5) then
  17.   JY.Person[jqid]["内力"] = JY.Person[jqid]["内力"] + 4 + math.random(2)
  18. end

  19. --brolycjw: 先天功回内 --只有冰封值为空 才可以先天功回内
  20. if WAR.ICE[jqid] == nil and PersonKF(jqid, 100) then
  21.   JY.Person[jqid]["内力"] = JY.Person[jqid]["内力"] + 2 + math.random(1)
  22. end
复制代码


就这样,冰封减内效果就完成了,实例中利用WAR.ICE表记录了所有人的冰封值,因为冰封值是跟着人物编号走的,所以是互不干扰独立计算的。

3.4  吃完了饭接着写吧…… 3.3已经把冰封效果做到时序减内并且九阳先天不能回内,冰封大于80减内翻倍,学了九阳时序回冰封翻倍
下面接着做减集气速度效果:冰封状态下集气速度减慢3点,寒冰状态减6点
搜索内伤减集气,继续在其上方添加代码
  1. --冰封状态下集气速度减慢3点,寒冰状态减6点
  2. if WAR.ICE[id] ~= nil then
  3.   WAR.Person[i].TimeAdd = WAR.Person[i].TimeAdd - 3
  4.   if WAR.ICE[id] > 80 then
  5.     WAR.Person[i].TimeAdd = WAR.Person[i].TimeAdd - 3
  6.   end
  7.   if WAR.Person[i].TimeAdd < 0 then
  8.     WAR.Person[i].TimeAdd = 0
  9.   end
  10. end
复制代码

3.5  冰封的效果已经全部做完了..那么是不是就完了呢?答案肯定是否定的= =
我接下来要做的是冰封状态的显示(同封穴、流血),好像很难。。。做做看吧 我也没试过`(*∩_∩*)′
第一步:判断是否要显示冰封状态,又要多键一个表了,这个表里记录被攻击单位是本次攻击否被冰封,方法同3.1,在WAR.ICE = {}下面添加一行 WAR.ICEXS = {} , 我就直接写到3.1的代码里去了。
第二部:接着在主角攻击产生冰封效果的同时,我们需要为 WAR.ICEXS 表的对应位置赋值,已写入3.2的代码
第三部:把冰封显示出来:
搜索 计算攻击到的人 找到以下代码,在这个表后面再增加一个,nil
  1. local hnum = 11;  --HitXY的长度个数,这个数本来是10,现在我们增加一个冰封效果就变成11
  2. --中间的不改
  3. HitXY[HitXYNum] = {x1, y1, nil, nil, nil, nil, nil, nil, nil, nil, nil};                --x, y, 生命, 内力, 体力, 封穴, 流血, 中毒, 解毒, 内伤, 冰封(新增的)
  4. --后面接着加
  5. if WAR.ICEXS[WAR.Person[i]["人物编号"]] == 1 then --是否显示冰封
  6.   HitXY[HitXYNum][11] = "冰封"  --修改表中最后一个nil的文字,后面的代码会调用显示,我们不用管他了。
  7.   WAR.ICEXS[WAR.Person[i]["人物编号"]] = nil --重置显示冰封判断,这个很重要,如果没有这一句,这场战斗敌人会一直显示冰封。
  8. end
复制代码


好了,“表”的教程,到这里就结束了,希望童鞋们能看看。


我也不知道这样写,你们能看懂多少,也许又是懂的不看,看的不懂 `(*∩_∩*)′ 就这样吧,再见~~


返回教程索引



评分

参与人数 1声望 +8 收起 理由
tsmdsyp + 8 好帖奖励

查看全部评分

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

写不下了
抢沙发

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

松割的教程,顶一下
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-14 20:22 | 显示全部楼层
有趣的教程,支持一下。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-14 20:24 | 显示全部楼层
= =看得我蛋疼

点评

两人都蛋疼~  发表于 2012-9-5 23:06
写得我才蛋疼  发表于 2012-8-14 20:53
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-14 20:28 | 显示全部楼层
超赞。无私奉献行为。

虽然不能完全看懂,但,俺要学到学会为止。

恳请继续。

点评

谢谢支持啦,最希望的就是写出的东西有人看。。  发表于 2012-8-14 20:36
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-14 22:21 | 显示全部楼层
为了把你这教程的链接塞进主楼里我试了不止10次啊啊,坑爹的字数限制...貌似超链接的长度也算在字符里面,却又不提醒一下......

点评

不是吧 这么坑...  发表于 2012-8-14 22:27
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-14 22:33 | 显示全部楼层
就是那么坑!

科班出身的果然不一样丫,条理清晰张弛有序用起名词来都这么专业,鼓掌,献花

点评

整好了...这东西真难排版  发表于 2012-8-14 23:22
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2012-8-14 22:42 | 显示全部楼层
回复 二宫和也 的帖子

别这么说= = 我会谦虚的~~

点评

报告教授,3.3的第一段代码看起来很乱,整整吧  发表于 2012-8-14 23:09
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-14 22:45 | 显示全部楼层
原来前面加""..就能把数值转化为文字么...我一直都是用tostring()的= =

另外看到攻方和受方这两个词,我深深地觉得,你不要叫伊万了,改叫你弯好了

点评

听说string.format速度最快  发表于 2012-8-17 22:34
^_^ 学习中也要带点娱乐嘛,这叫寓教于乐相结合  发表于 2012-8-14 22:53
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-14 23:29 | 显示全部楼层
谢谢楼主推荐的编辑器,呵呵,比NOTEPAD++靠谱多了

点评

我擦.........明明是notepad++好用,不识货的人们啊!  发表于 2012-8-14 23:59
嘿嘿,我也是这样觉得  发表于 2012-8-14 23:32
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-15 08:02 | 显示全部楼层
只看字数我就果断跪了,让我来写一个星期估计也就能写这么多……

点评

没那么夸张吧 = = 我看你写的那个也不少字呀  发表于 2012-8-15 08:12
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2012-8-15 09:29 | 显示全部楼层
有新版源码参照,冰封与灼烧的理解就更直观了吧
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2012-8-17 08:19 | 显示全部楼层
此贴已改名,向二宫和也童鞋看齐
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-4-2 12:19 | 显示全部楼层
if WAR.ICE[jqid] > 70 then  --如果冰封程度大于70,则进入寒冰状态,时序减内翻倍。

    JY.Person[jqid]["内力"] = JY.Person[jqid]["内力"] - math.random(3) - math.modf(JY.Person[jqid]["受伤程度"] / 15)

是否要乘以2:JY.Person[jqid]["内力"] = JY.Person[jqid]["内力"] - (math.random(3) + math.modf(JY.Person[jqid]["受伤程度"] / 15))*2

点评

不用~上一层判断 WAR.ICE[jqid] ~=nil时 已经减一次内力了  发表于 2013-4-2 12:22
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-4-2 12:30 | 显示全部楼层
kf[5][0] = {“1”,"2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2"}
有这种表达方法否
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2013-4-3 22:17 | 显示全部楼层
KA 发表于 2013-4-2 12:30
kf[5][0] = {“1”,"2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2","2 ...

理论上是有吧。。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2018-4-11 13:47 | 显示全部楼层
哇,我来挖。。。。受教 了。为了我的自创人物
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-5-6 01:21

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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