大家好啊,我是之前发 编辑大量对话的插件 和 拆分代码的工具 的新人。
这次我又来发脚本了。
我不知道大家是怎么管理游戏的流程的啊。。。
我最开始是设置了几个变量和开关来管理流程。。但序章都没写完就管理不过来了。。。经常一个事件要判断N个变量+N个开关。。。又不能用复合条件,全靠if来套。。。整个事件流搞得难看得要死。。。
所以就搞了这个插件。。。
先简单说说使用方法吧:
导入插件:
注意,本插件和我之前发的消息插件一样,也依赖 "LYZ_Core" 这个插件,。或者说我的个人插件都会依赖这个。
几个参数:
"Flow Tree Definition"是文件名,文件放在"data/FLOW"文件夹下:
Tab Indent,几个tab算作一次缩进。
Space Indent,几个空格算作一次缩进
缩进是用来判定这是哪一级流程的,非常重要。
Max Depth是表示流程树有多深,默认为8层,虽然我至今最多只用到了3层。
然后光说参数含义还是肯定懂不了,所以再来说说流程定义文件。长这样。
TEXT 代码
- 第一卷
- 第一章
- 事件1
- 事件2
- 事件3
- 第二章
- 事件1
- 事件2
- 事件3
- 第三章
- 事件1
- 事件2
- 事件3
- 第二卷
- 第一章
- 事件1
- 事件2
- 事件3
- 第二章
- 事件1
- 事件2
- 事件3
- 第三章
- 事件1
- 事件2
- 事件3
复制代码
很典型的树状结构。缩排就是用来表示流程级别的。比如第一卷第二卷是一级流程,第一章第二章之类是二级流程,事件1事件2之类是三级流程,
郑重提醒,缩排用的格式最好全文件统一,
用tab就全用tab,用空格就全用空格,混用特别容易出错。
深度就是最多有几级流程,比如现在这个流程树深度为3。
所有流程都不允许以'$'开头,有可能会跟保留字段冲突。
占位流程($):每一级流程之前都有一个名为'$'的流程,在没有设置子流程之前用于占位之用。
流程的值(.$value):每个流程会被自动分配一个值,从上到下依次增加,占位流程的值与父流程相同。
举个栗子,还是拿上面的流程树来说:
这代码里面Flow是根流程,所有一级流程都是它的子流程
JAVASCRIPT 代码
- Flow.第一卷.$value==1
- Flow.第一卷.第一章.$value==2
- Flow.第一卷.第一章.事件1.$value==3
- Flow.第一卷.第一章.事件2.$value==4
- Flow.第一卷.第二章.$value==6
- Flow.第一卷.第二章.事件3.$value==9
- Flow.第二卷.$value==14
- Flow.第二卷.第二章.事件3.$value==22
- Flow.$.$value==0
- Flow.$.$.$.$value==0
- Flow.第一卷.$.$value==1
- Flow.第一卷.$.$.$value==1
- Flow.第一卷.第二章.事件3.$.$.$.$value==9
复制代码
以此类推
常用语句:
JAVASCRIPT 代码
- Flow.XX卷.XX章.XX事件 //获取指定流程对象
- Flow() /*或*/ Flow.$Current //可以获取当前所在流程对象
- //流程对象可以使用以下函数(流程b参数可以省略,省略则视为带入了Flow.$Current)
- 流程a.$eq(流程b) /*或*/ 流程a.$is(流程b) //比较两个流程是否相同
- 流程a.$lt(流程b) /*或*/ 流程a.$before(流程b) //判断流程a是否在b流程之前
- 流程a.$gt(流程b) /*或*/ 流程a.$after(流程b)//判断流程a是否在b流程之后
- 流程a.$le(流程b) /*或*/ 流程a.$ngt(流程b) //判断流程a是否在b流程之前或者相同
- 流程a.$ge(流程b)/*或*/ 流程a.$nlt(流程b) //判断流程a是否在b流程之前或者相同
- 流程a.$ne(流程b) /*或*/ 流程a.$neq(流程b) //比较两个流程是否相同
- 流程a.$in(流程b) //判断流程a是不是流程b的子流程(包括直接和间接)
- 流程a.$contains(流程b)//判断流程a是不是流程b的父流程(包括直接和间接)
- 流程.$value /*或*/ 流程.$val 或 流程.$v //获取流程的值。如上面解释的。觉得上面的函数难看的话可以用 流程 "a.$v==流程b.$v"之类的语句来进行流程判定。
- 流程.$index /*或*/ 流程.$i //获取该流程是福父流程的第几个流程,占位流程为0,正式流程从1开始。
- 流程.$chilren //获取该流程的所有子流程。
- 流程.子流程名字 /*或*/ 流程['子流程名字'] //直接获取指定子流程,'Flow.XX卷.XX章.XX事件'即为此语句的串联用法
- Flow[ i ] //获取当第i级流程,i=0时会获取到根流程
- Flow[ i ]='流程名' //设置当前第i级流程,必须是Flow[i-1]的子流程才会成功,i不允许为0
复制代码
还有很多高级用法说不完,下面就是定义流程对象类型的代码片段,愿意的自己可以啃代码;
Chapter类
这些语句都知道了,在哪用呢:
主要是两个地方:判断流程和设置流程
判定(Flow的F大写):
设置(插件指令和脚本均可,区别只是脚本只能F大写,插件指令F大小写均可):
因为是脚本,所以均支持复合条件判定
比如 Flow.第一卷.$contains() || Flow.第二卷第四章.$is()
或者 Flow.第一卷.第一章.$lt() && Flow.第二卷第四章.$gt()
另外关于如何判断游戏开始。
游戏第一次进入时所在的流程是$.$.$.$......值为0
所以可以像我图中那样用Flow().$v==0来判定,也可以用Flow.$is()来判定,第二种更简洁,第一种语义更明确,用哪种看喜好。
流程发生切换的时候会自动在控制台打log方便调试。
当前所在流程会被存档,读档时是根据名字进行索引的,所以如果只是改了流程顺序或者增加了流程存档仍然可用,但如果流程改了名字或者删除了流程,进度刚好在被改名或者删除的流程位置的存档会失效。
其他:
Flow对象是插件定义在全局对象上的属性,如果发生命名冲突可以通过LYZ.Flow或者LYZ.FlowManager.Flows['Main']来访问这个对象。
插件默认只创建了一个全局流程管理对象(即Flow对象),用于管理整个游戏的流程
但是可以用LYZ.FlowManager.MakeFlow(filename,key)来创建新的流程管理对象,每个对象各自独立。可以通过返回值或者LYZ.FlowManager.Flows[key]来获取这个对象。
比如如果会写脚本的话可以将这东西附着在任务对象上,让任务系统也拥有流程管理能力。
下载在这:
[attachments]0[/attachments]
本帖来自P1论坛作者大钊,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg. blue/forum.php?mod=viewthread&tid=391001 若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。