“关卡加载”的版本间的差异
小 |
BallanceBug(讨论 | 贡献) 小 (→Load LevelXX) |
||
第12行: | 第12行: | ||
== Load LevelXX == | == Load LevelXX == | ||
− | # | + | # 从CurrentLevel读取当前需要被加载的关卡,然后在名为"AllLevel"的Array中将数字减一并按Row寻找文件名,然后在3D Entities\Level\下找文件加载。 |
# 新建一个名为All_Level的Group,将新加载的关卡中的所有物件归到此组中,让后将此组插入到表RegisterNMO中(Load ID = 1) | # 新建一个名为All_Level的Group,将新加载的关卡中的所有物件归到此组中,让后将此组插入到表RegisterNMO中(Load ID = 1) | ||
# 发送阶段完成信号("Part_Loaded"Message,Dest是Level,下同)(1格进度条) | # 发送阶段完成信号("Part_Loaded"Message,Dest是Level,下同)(1格进度条) |
2020年7月24日 (五) 10:29的版本
不完善的条目 | ||
---|---|---|
关卡加载是指玩家从主菜单或通关界面点击关卡,然后加载新的关卡的过程。游戏中,关卡加载的视觉过程表现为黑色的游戏界面,最下方存在从左到右依次加载的、被分为八格的、随着加载程度增加而逐渐变亮的进度条。
本页面将介绍关卡的加载方式,由于是基于Virtools的原理简介,各标题将使用Virtools中连线图的名称。
为了方便本页面有助于自制地图检查卡进度条等情况,会额外标注一些提示用来注解当前段容易在哪写地方出错,以及会错在哪里。
目录
Init Arrays
- 恢复四个物体的IC:Checkpoints, PH_Groups, Reset_Points, PH
Load LevelXX
- 从CurrentLevel读取当前需要被加载的关卡,然后在名为"AllLevel"的Array中将数字减一并按Row寻找文件名,然后在3D Entities\Level\下找文件加载。
- 新建一个名为All_Level的Group,将新加载的关卡中的所有物件归到此组中,让后将此组插入到表RegisterNMO中(Load ID = 1)
- 发送阶段完成信号("Part_Loaded"Message,Dest是Level,下同)(1格进度条)
load Music
- 将Musicfiles.nmo放入"Levelinit_Loading"中,再将"Levelinit_Loading"放入Loading_Param,然后执行脚本LoadingManagerScript,然后清空Levelinit_Loading
- 根据GameSetting中的13列LowMemory判断,如果为真,则从Sounds_low加载音乐,否则从Sounds加载
- 构造了文件名,加载三个音乐文件并归入All_Music组(加载失败不会阻止后续操作)
- 如果关卡为12/13关,创建名为Music_thunder和Music_LastFinal的音乐对象并加载,并归入All_Music组(加载失败不会阻止后续操作)
- 运行脚本Music_Init
load Tutorial.nmo
- 读取GameSettings,确认是否需要Tutorial,如果不需要,跳过本节后续步骤
- 将Tutorial.nmo放入Levelinit_Loading中,再将Levelinit_Loading放入Loading_Param,然后执行脚本LoadingManagerScript,然后清空Levelinit_Loading
set CurrentLevel
- 读取AllLevel,获得该关卡对应的StartBall,实例化一个然后添加到CurrentLevel里
- 实例化一个Ball_Pos_Frame添加到CurrentLevel里
Process Placeholder
Set Sector Attribute
- 使用Sector_0前缀,以从1-9(包含两端数字)的循环开始寻找小节组
- 如果找到了,就遍历当前组的对象,为其添加名为Sector的Attribute,值为当前小节的编号(基于1),然后以无依赖模式删除小节组。如果没找到从当前模块跳出
PS:如果1-9的所有小节组都找到了,那么程序会卡在这里卡死
Replace PH
- 遍历PH_Groups,对于每一行,查找其Group Names的组,然后开始遍历里面的物体
- 如果物体没有Sector的Attribute,那么程序会卡死在这。如果有Sector,将会把此物品记录在PH表内,包括这个物体本身(3d Entity),World Matrix,归属的机关类型名(上文的Group Names)和对应的小节组
- 遍历PH表,以全部依赖模式删除物体本身(3d Entity)
Count PH
- 将PH_Groups表中的第一列Amount全部清空为0
- 获取PR_Resetpoints组中的物体个数,然后用其启动一个从1开始步长为1,以物体个数为结束值的Counter(即每一小节做一个循环)
- 对于每一个循环(每一小节),从PH表中筛选Sector为当前小节号的机关并将其归属的机关类型名写入PH_Counter,然后循环PH_Groups(循环已知的机关模型列表)然后计算PH_Counter中是当前选中行类型的机关的个数并将其写入当前行的第一列Amount,完毕后最后清空PH_Counter,如此往复直到各个小节处理完毕
- 对PH第一列Sector进行升序排序
- 发送阶段完成信号(2格进度条)
load Placeholder
- 遍历PH_Groups,如果Amount大于0,那么就将其机关类型名(Group Names)加上.nmo后的字符串加入Levelinit_Loading表,准备加载
- 将Levelinit_Loading放入Loading_Param,然后执行脚本LoadingManagerScript,然后清空Levelinit_Loading
- 发送阶段完成信号(3格进度条)
init and load Checkpoints
- 获取PC_Checkpoints组,选取组内的第一个元素(Group Iterator遍历第一项,而处理结束后直接链接到BB Graph Out),获取其名称并删除最后3个字符,再加上.nmo,将组装好的名字放入Levelinit_Loading中(相对路径为:3D Entities\PH\;启动init脚本为:是),再将Levelinit_Loading放入Loading_Param,然后执行脚本LoadingManagerScript,然后清空Levelinit_Loading
- 将上文获取到的删除最后3个字符的名称在末尾加上_MF,获取对应的物体,将其以Custom Dependencies(复制Script, Group Belonging和Attribute但不复制其余的)复制一份
- 获取PC_Checkpoints组中元素个数,并填充相等的行数在表Checkpoints中
- 遍历PC_Checkpoints组,以_分割物体名称并取其第三位(小节序号)如果为奇数,则使用之前获取的加_MF的物体,如果为偶数,则使用之前从_MF复制来的物体。并获取当前遍历物体的World Martrix一并写入表Checkpoints中(写入行数为之前分割物体名称获取到的小节序号-1)
- 遍历PC_Checkpoints组,以Full Dependencies模式删除所有物体
- 发送阶段完成信号(4格进度条)
PS:如果PC_Checkpoints中没有任何元素,程序会继续运行,不会停止
init Resetpoints
- 与上一节类似,获取PR_Resetpoints组中元素个数,并填充相等的行数在表ResetPoints中
- 遍历PR_Resetpoints组,以_分割物体名称并取其第三位(小节序号)。获取当前遍历物体的World Martrix写入表ResetPoints中(写入行数为之前分割物体名称获取到的小节序号-1)
- 遍历PR_Resetpoints组,以Full Dependencies模式删除所有物体
init and load Levelstart
- 获取PS_Levelstart组,选取组内的第一个元素(Group Iterator遍历第一项,而处理结束后直接链接到BB Graph Out),获取其名称并删除最后3个字符,再加上.nmo,将组装好的名字放入Levelinit_Loading中(相对路径为:3D Entities\PH\;启动init脚本为:是),再将Levelinit_Loading放入Loading_Param,然后执行脚本LoadingManagerScript,然后清空Levelinit_Loading
- 将上文获取到的删除最后3个字符的名称在末尾加上_MF,获取对应的物体,然后再获取其World Matrix,然后一并插入表PH中(其他字段数值:Sector: 01;Set: True;Type Name:PS_Levelstart)
- 遍历PS_Levelstart组,以Full Dependencies模式删除所有物体
- 发送阶段完成信号(5格进度条)
PS:如果PS_Levelstart中没有任何元素,程序会继续运行,不会停止