Create tutorial
从这里开始,代码的实现需要灵活运用。如果自己卡住了请及时寻求他人帮助
1.循环命令与中级变量使用
我们在一级对话框中学习了简单的界面拼接,你应该已经可以实现类似下图的界面功能了(如果你看了下图觉得还有难点,请先自行思考或寻求帮助)
但是下图的内容实现起来还比较困难:
以装备首爆为例,其需要112条任务栏。不论是赋值还是展示都不可能全部写出来(不是不行,但是会死)。
首先我们来解决数量太多的问题,解决方法:循环与变量使用
(1)loop
阅读wiki:http://112.124.36.36/redmine/projects/tejie/wiki/Loop
注意,loop绑定于#if,意味着循环语句下无法直接单独加入另一个条件判断。可以联动goto指令跳过该限制,如:
#if loop 的循环内容实际仅在红框内,即该#if下的#act,循环结束后继续执行下面的命令。值得注意的是:n$循环计数 以及 S$变量$str(n$循环计数) 的使用。这样的动态计数与赋值能满足大部分循环的实际使用场景。执行次数支持变量
值得注意的是,loop语句本身挂在#if中,这也意味着如果#if内条件持续不满足,循环指令会持续不执行。这一点与下面的loopgoto有显著区别。于是该语句可以实现动态检索,例如循环执行200次,但在第X次退出。这样的写法在scripts\Mir200\Envir\QuestDiary\便捷功能 的两个功能中都有体现,可以查看了解
(2)loopGoto
与loop不同,loopgoto为#act下执行命令,但注意:循环次数为空或0时,会执行一次。其余效果无太大差别。一般loopgoto无法做条件限制,即赋值几次就做几次循环
使用方法见wiki:http://112.124.36.36/redmine/projects/tejie/wiki/LoopGoto
(3)while
非常注意:如果上述循环不能满足你的需求,且实在实在没办法了,再尝试使用while。
阅读wiki:http://112.124.36.36/redmine/projects/tejie/wiki/While
由于特戒代码的执行是顺序执行的,上面的两个循环都限制了循环次数,即使测试时循环200次中的打断出了问题,执行200次就结束了。但是while 是条件检测终止,这意味着一旦你的while语句写出了问题,导致循环无法结束,就会导致程序死循环。即便只有一行print,服务器也得好几分钟用不了。非必要不使用,非使用必谨慎。
循环语句一般与其他功能结合使用,可自行练习或在下面3.中一起练习
2.静态表.csv文件的使用(全局表)
为提高脚本程序的可延展性,在制作实际功能中,我们对其中的部分内容以数据表的形式存储,例如将奖励道具的种类、数量存储,即可实现快捷的内容替换。这种表格对所有玩家通用(玩家甲乙在同一活动中领取同样的奖励),以csv的形式存储,我们成为全局表。
非常重要,阅读wiki页面中的tbl_load,tbl_size,表变量,表遍历:http://112.124.36.36/redmine/projects/tejie/wiki/%E6%95%B0%E6%8D%AE%E8%A1%A8%E6%A8%A1%E5%9D%97
csv表为逗号间隔存储数据的xlsx表,仅保存表格内实际值。可以新建exsel表另存为csv格式创建。
表格的格式如下所示。因为默认第一列是“关键字”,命名非常重要,表内关键字不能重复,且要好调用。如下表
那么在调用表内容时,用$tbl(表名称,任务$str(n$变量),表头值)即可。
此外,表头的其他命名(奖励道具1、奖励数量1等)不可重复(不同表可复用)。
tbl_load:使用注意:除wiki内介绍,实际上线产品的tbl_load统一放置在触发器/开服触发中。但练习中可以放在自己的程序里,这样可以修改表后直接重载、运行脚本就能实现更新。全局表的命名为:tb_g表格名(table_global)
tbl_size:除去表头的条目数量,;例如上图数量为15。常用于循环遍历时限制循环次数
请自行创建一个数据表,并在练手程序中实现获取表格指定位置数据。
小tips:为了便于后期维护表格,表格内的道具与id可以只填写道具名,在需要道具id的时候(例如itemshow)使用脚本命令getDBItemFieldValue获取
http://112.124.36.36/redmine/projects/tejie/wiki/GetDBItemFieldValue
3.复杂列表功能实现
仔细阅读wiki以及页面内其他代码:http://112.124.36.36/redmine/projects/tejie/wiki/Dlg_itemGrid_
(1)基础列表实现
了解其基础用法后,请尝试制作一个纵向滑动,总计1列、3行,每行包含序号和1个按钮的列表。注意:itemIndex的使用,mov与inc的使用。
(2)循环命令生成列表
这样做出来的列表只要格式正确,基本不会出错。但是缺点也非常明显:当每个块需要改动时,需要全部替换;在表格数量大的时候更为明显。这个时候我们就将上面的循环与该程序结合,实现循环创建。这里可以先查看示例代码,再仿照修改自己的代码
(3)循环生成列表与按钮交互
循环的优点显而易见,但是上面的代码存在问题:按钮的跳转也变得统一了,就失去了意义。改进方法有两种。
(一)通过变量自定义按钮跳转
修改imgButton命令 imgButton:anniu_hong_01:230:250:按钮/@按钮$str(n$示例循环计数)。这里是利用了程序格式,将跳转块从[@按钮]变成了[@按钮1]、[@按钮2]……可以对每个独立的按钮进行设置
(二)跳转传参数
非常重要
修改imgButton命令 imgButton:anniu_hong_01:230:250:按钮/@按钮($str(n$示例循环计数)。在@功能块的后面接括号,意为向对应模块传递参数。例如:@按钮(1,2) 会运行[@按钮],并传递两个变量:1和2。运行程序会将接受的变量存储于$scriptparamX中,例如:
将其应用于列表,则实现:通过变量控制不同按钮的不同效果
(4)进阶:带条件判断顺序的表结构
我们将刚才生成的表内容$str(S$示例列表)用print打印出来,得到:
(itemindex:1text:1:30:250imgbutton:anniu_hong_01:230:250:按钮/@按钮)
(1)itemindex:2text:2:30:250imgbutton:anniu_hong_01:230:250:按钮/@按钮
(2)(itemindex:3text:3:30:250imgbutton:anniu_hong_01:230:250:按钮/@按钮)
(3)itemindex:4text:4:30:250imgbutton:anniu_hong_01:230:250:按钮/@按钮
(4)(itemindex:5text:5:30:250>imgbutton:anniu_hong_01:230:250:按钮/@按钮)
(5)itemindex:6>text:6:30:250imgbutton:anniu_hong_01:230:250:按钮/@按钮
(6)
你会发现其实我们刚才的过程,都是为了生成这样一段字符串做的努力。
那么既然已经结果,我们就可以将过程进行拆解,加入我们需要的逻辑判断,
例如:
将上述的列表顺序变为先奇数、后偶数。
请先自行思考
我们上面的程序逻辑其实是:创建一个空变量存储A,向A中加一组数据、加一组数据、加一组数据……也就是:
+(itemindex:1
+imgbutton:anniu_hong_01:230:250:按钮/@按钮(1))
+(itemindex:2
+imgbutton:anniu_hong_01:230:250:按钮/@按钮(2))
当我们需要将每一组数据做单独判断时,我们需要将每一组数据独立,并做判断。于是逻辑变为 向A中加入A1、A2、A3……也就是
+(itemindex:1imgbutton:anniu_hong_01:230:250:按钮/@按钮(1))
+(itemindex:2imgbutton:anniu_hong_01:230:250:按钮/@按钮(2))
但这并不是说inc合并,而是把每一组数据存储在独立变量里,判断是否添加。程序如下:
上述程序中,将每一个块独立生成后存储在不同单位中,即可根据需要的逻辑,去判断是否加入展示组。
再进阶一步,将程序逻辑升级:首先生成所有所需要的模块A1A2A3……经过判定条件1,将A1A3A5加入A,经过判定条件2,将A2A4A6加入A
这样的思路其实才是最终实现功能的思路,即:创建、选择、汇总。例如程序/游戏功能/转生竞技.txt:
实现效果:已领取的奖励垫底。实现思路:将所有功能块生成后,先加入未领取的条目,后加入已领取的条目。
(更变态可参考装备首爆,加入顺序分为:可领取、未领取、已领取、无名额)
4.动态表的使用
在游戏过程中,需要动态存储数据的,一般在游戏中通过命令修改表格。
阅读wiki:由于这部分wiki细节较多,请仔细http://112.124.36.36/redmine/projects/tejie/wiki/%E6%95%B0%E6%8D%AE%E8%A1%A8%E6%A8%A1%E5%9D%97
注意:特戒代码的命令全部由玩家自己触发。
表格功能主要用于存储和读取信息,应用例如:
玩家的主线任务进度、任务描述、任务类型;某排名活动积分前10的玩家id、玩家名、积分;玩家存储临时仓库等。使用十分灵活。
请尝试手动创建一个玩家表,用来记录玩家游玩获取的道具(消耗道具不变),并在程序中显示玩家获得最多的道具
5.时间逻辑相关使用
涉及到时间计算的功能,常用的有倒计时timetips:
http://112.124.36.36/redmine/projects/tejie/wiki/Dlg_timeTips_
时间脚本变量,时间戳:
http://112.124.36.36/redmine/projects/tejie/wiki/%E8%84%9A%E6%9C%AC%E5%8F%98%E9%87%8F
详细补充一下时间戳的概念:时间戳是以数字形式表示某个时间点的值,通常从 1970 年 1 月 1 日 00:00:00 UTC 开始计算的秒数。也就是说可以用一个数值去记录玩家触发的一个时间点,精确到秒。
在实现实际功能时,需要对问题进行分析,确定时间使用方案。但部分时间的应用场景不需要使用时间计算,例如:根据开服天数触发,使用变量G99即可;角色累计登录天数,在daychaged触发器记录即可;限定时间进入的用#if与hour
min结合使用等。
时间类条件的主要误区在于:玩家退出窗口、离线后,时间计数问题。需要时间计算的大多用
(1)每隔x时间执行1次的
例如专属boss挑战次数、神兵秘境挑战次数等。
玩家需要的效果是:经过x小时再登录,次数回复了x点,界面中显示着下一次回复需要的时间倒计时,若正好倒计时结束,重新进入下一阶段倒计时。
从脚本实现考虑:不需要也不可能让服务器在后台每秒算玩家的剩余时间。“经过了x小时”本质上是“玩家的触发A”与“玩家的触发B”之间,两个时间戳的差值,在根据需要,将差值(秒)进行运算,获得增加点数以及下一次刷新需要的时间。
界面显示的时间倒计时只是上面计算值与倒计时显示的组合,倒计时展示本身并没有意义,timetips自带的模块跳转可作为界面刷新来触发B,执行上面的内容,以达成给玩家的展示效果
请尝试制作上图中的计时功能简略版,如下图所示。自行分析需求细节并实现功能(倒计时时长自行把控)
(2)在线每x时间执行一次的
该功能为触发器功能,阅读wiki并查看脚本用例:http://112.124.36.36/redmine/projects/tejie/wiki/SetOnTimer3
注意:该脚本仅在玩家在线过程中可用,离线后不再触发。该程序不可用作某界面的实时每秒刷新,每秒刷新会占用过多内存导致卡顿等问题。
引擎完全开源
DeepSeek一键生成脚本
超万件精品素材全免费
助推你的创作自由
版本统一管理避免泄露
更安全
风险低回款快
轻松无忧
多名业内高级专家
一对一服务
京B2-20180821 | 京ICP备2022012571号