打开主菜单

Ballance Wiki β

关卡加载

9826HZg讨论 | 贡献2020年7月23日 (四) 17:37的版本
AmboxProfessor.jpeg 专业性词条
此词条含有较多的专业术语,请您确认您是否具有相关的知识储备。如果有任何理解上的困难,可以翻阅相关资料进行理解或咨询相关人士。

关卡加载是指玩家从主菜单通关界面点击关卡,然后加载新的关卡的过程。游戏中,关卡加载的视觉过程表现为黑色的游戏界面,最下方存在从左到右依次加载的、被分为八格的、随着加载程度增加而逐渐变亮的进度条。

本页面将介绍关卡的加载方式,由于是基于Virtools的原理简介,各标题将使用Virtools中连线图的名称。

为了方便本页面有助于自制地图检查卡进度条等情况,会额外标注一些提示用来注解当前段容易在哪写地方出错,以及会错在哪里。

目录

Init Arrays

  1. 恢复四个物体的IC:Checkpoints, PH_Groups, Reset_Points, PH

Load LevelXX

  1. 从CurrentLevel读取当前需要被加载的关卡,然后去"AllLevel"Array中将数字减一并按Row寻找文件名,然后在3D Entities\Level\下找文件加载。
  2. 新建一个名为All_Level的Group,将新加载的关卡中的所有物件归到此组中,让后将此组插入到表RegisterNMO中(Load ID = 1)
  3. 发送阶段完成信号("Part_Loaded"Message,Dest是Level,下同)(1格进度条)

load Music

  1. 将Musicfiles.nmo放入"Levelinit_Loading"中,再将"Levelinit_Loading"放入Loading_Param,然后执行脚本LoadingManagerScript,然后清空Levelinit_Loading
  2. 根据GameSetting中的13列LowMemory判断,如果为真,则从Sounds_low加载音乐,否则从Sounds加载
  3. 构造了文件名,加载三个音乐文件并归入All_Music组(加载失败不会阻止后续操作)
  4. 如果关卡为12/13关,创建名为Music_thunder和Music_LastFinal的音乐对象并加载,并归入All_Music组(加载失败不会阻止后续操作)
  5. 运行脚本Music_Init

load Tutorial.nmo

  1. 读取GameSettings,确认是否需要Tutorial,如果不需要,跳过本节后续步骤
  2. 将Tutorial.nmo放入Levelinit_Loading中,再将Levelinit_Loading放入Loading_Param,然后执行脚本LoadingManagerScript,然后清空Levelinit_Loading

set CurrentLevel

  1. 读取AllLevel,获得该关卡对应的StartBall,实例化一个然后添加到CurrentLevel里
  2. 实例化一个Ball_Pos_Frame添加到CurrentLevel里

Process Placeholder

Set Sector Attribute

  1. 使用Sector_0前缀,以从1-9(包含两端数字)的循环开始寻找小节组
  2. 如果找到了,就遍历当前组的对象,为其添加名为Sector的Attribute,值为当前小节的编号(基于1),然后以无依赖模式删除小节组。如果没找到从当前模块跳出

PS:如果1-9的所有小节组都找到了,那么程序会卡在这里卡死

Replace PH

  1. 遍历PH_Groups,对于每一行,查找其Group Names的组,然后开始遍历里面的物体
  2. 如果物体没有Sector的Attribute,那么程序会卡死在这。如果有Sector,将会把此物品记录在PH表内,包括这个物体本身(3d Entity),World Matrix,归属的机关类型名(上文的Group Names)和对应的小节组
  3. 遍历PH表,以全部依赖模式删除物体本身(3d Entity)

Count PH

  1. 将PH_Groups表中的第一列Amount全部清空为0
  2. 获取PR_Resetpoints组中的物体个数,然后用其启动一个从1开始步长为1,以物体个数为结束值的Counter(即每一小节做一个循环)
  3. 对于每一个循环(每一小节),从PH表中筛选Sector为当前小节号的机关并将其归属的机关类型名写入PH_Counter,然后循环PH_Groups(循环已知的机关模型列表)然后计算PH_Counter中是当前选中行类型的机关的个数并将其写入当前行的第一列Amount,完毕后最后清空PH_Counter,如此往复直到各个小节处理完毕
  4. 对PH第一列Sector进行升序排序
  5. 发送阶段完成信号(2格进度条)

load Placeholder

  1. 遍历PH_Groups,如果Amount大于0,那么就将其机关类型名(Group Names)加上.nmo后的字符串加入Levelinit_Loading表,准备加载
  2. 将Levelinit_Loading放入Loading_Param,然后执行脚本LoadingManagerScript,然后清空Levelinit_Loading
  3. 发送阶段完成信号(3格进度条)

init and load Checkpoints

  1. 获取PC_Checkpoints组,选取组内的第一个元素(Group Iterator遍历第一项,而处理结束后直接链接到BB Graph Out),获取其名称并删除最后3个字符,再加上.nmo,将组装好的名字放入Levelinit_Loading中(相对路径为:3D Entities\PH\;启动init脚本为:是),再将Levelinit_Loading放入Loading_Param,然后执行脚本LoadingManagerScript,然后清空Levelinit_Loading
  2. 将上文获取到的删除最后3个字符的名称在末尾加上_MF,获取对应的物体,将其以Custom Dependencies(复制Script, Group Belonging和Attribute但不复制其余的)复制一份
  3. 获取PC_Checkpoints组中元素个数,并填充相等的行数在表Checkpoints中
  4. 遍历PC_Checkpoints组,以_分割物体名称并取其第三位(小节序号)如果为奇数,则使用之前获取的加_MF的物体,如果为偶数,则使用之前从_MF复制来的物体。并获取当前遍历物体的World Martrix一并写入表Checkpoints中(写入行数为之前分割物体名称获取到的小节序号-1)
  5. 遍历PC_Checkpoints组,以Full Dependencies模式删除所有物体
  6. 发送阶段完成信号(4格进度条)

PS:如果PC_Checkpoints中没有任何元素,程序会继续运行,不会停止

init Resetpoints

  1. 与上一节类似,获取PR_Resetpoints组中元素个数,并填充相等的行数在表ResetPoints中
  2. 遍历PR_Resetpoints组,以_分割物体名称并取其第三位(小节序号)。获取当前遍历物体的World Martrix写入表ResetPoints中(写入行数为之前分割物体名称获取到的小节序号-1)
  3. 遍历PR_Resetpoints组,以Full Dependencies模式删除所有物体

init and load Levelstart

  1. 获取PS_Levelstart组,选取组内的第一个元素(Group Iterator遍历第一项,而处理结束后直接链接到BB Graph Out),获取其名称并删除最后3个字符,再加上.nmo,将组装好的名字放入Levelinit_Loading中(相对路径为:3D Entities\PH\;启动init脚本为:是),再将Levelinit_Loading放入Loading_Param,然后执行脚本LoadingManagerScript,然后清空Levelinit_Loading
  2. 将上文获取到的删除最后3个字符的名称在末尾加上_MF,获取对应的物体,然后再获取其World Matrix,然后一并插入表PH中(其他字段数值:Sector: 01;Set: True;Type Name:PS_Levelstart)
  3. 遍历PS_Levelstart组,以Full Dependencies模式删除所有物体
  4. 发送阶段完成信号(5格进度条)

PS:如果PS_Levelstart中没有任何元素,程序会继续运行,不会停止

init and load Levelende

Copy Objects

fill DepthTest Group

set MF-Objects in Array

init Placeholders

set Mapping and Texture

set Env. Mapping

Full Version?

Load Sky-Textures

Set Mat Laterne

init Level

Preload Sound