更改

跳转至: 导航搜索

关卡加载

添加6,776字节2020年6月30日 (二) 17:29
先写那么多(
{{NeedContent/zh}}
{{ProfessionalArticle/zh}}

本页面将介绍关卡的加载方式,由于是基于Virtools的原理简介,各标题将使用Virtools中连线图的名称
为了方便本页面有助于自制地图检查卡进度条等情况,会额外标注一些提示用来注解当前段容易在哪写地方出错,以及会错在哪里

== Init Arrays ==
# 恢复四个物体的IC:Checkpoints, PH_Groups, Reset_Points, PH

== Load LevelXX ==
# 从CurrentLevel读取当前需要被加载的关卡,然后去AllLevel中寻找文件名,然后在3D Entities\Level\下找文件加载。
# 新建一个名为All_Level的Group,将新加载的关卡中的所有物件归到此组中,让后将此组插入到表RegisterNMO中(Load ID = 1)
# 发送阶段完成信号(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 ==
# 读取GameSetting,确认是否需要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中没有任何元素,程序会继续运行,不会停止

=== 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 ==
1,132
个编辑

导航菜单