# WebGAL 技术介绍
# 场景系统与预加载
# 场景获取
WebGAL 的场景是以文件为单位的,一般来说是后缀名为.txt
的WebGAL 脚本文件。就像很多编程语言有一个 main
函数作为入口一样,WebGAL 的入口场景是start.txt
。WebGAL 会首先尝试获取 start.txt
,然后调用WebGAL 解析器将脚本文件解析为 WebGAL 引擎可以执行的场景对象。在任何一个场景中,都可以使用choose
、changeScene
、callScene
这样的方式切换或“调用”场景。切换场景会直接替换当前的场景,而“调用”场景则会向场景调用栈中推入一个新的场景开始执行,并在执行后回到调用该场景的父场景。
# 预加载场景中的资源
在 WebGAL 解析场景的同时,场景所包含的资源也会被解析出来。对于每个场景文件,WebGAL 都会将其包含的所有资源,包括图片、音频以及视频文件。这些文件会在场景被解析完后开始预加载,以尽可能减少用户在游戏流程中等待资源加载的可能性。同时,为了使游戏在切换场景时更为顺畅,WebGAL 也会加载被当前的场景文件引用的场景文件的资源。为了防止资源浪费,WebGAL 只会拓展一层场景做预加载。
# WebGAL 解析器
# 语句解析 Ⅰ 拆分场景
WebGAL 场景文件主要是以行来区分脚本的。在解析的一开始,WebGAL 解析器就会按照换行符将脚本分割开。如果有分号,则会取分号前的字符。所以,WebGAL 脚本的注释方式就是将脚本写在分号后。
# 语句解析 Ⅱ 脚本类型解析
WebGAL 的脚本一般是形如
command:content -arg1 -arg2 ......;comment
的形式。
其中,command 代表语句指令,比如 bgm
、changeFigure
、choose
这样的指令,用于标明该语句对应的控制动作。而 content
则代表语句的主要内容,比如 bgm:Teabreak.mp3
表示的是播放一段音频文件作为 bgm。
# 语句解析 Ⅲ 对话的特殊处理
WebGAL 的对话一般以如下形式书写:
森川由绮:胸につかえていることを、时は解决してくれない。忘却のラベルを贴るだけで -voice_1.ogg;
对于视觉小说来说,由于对话一般是脚本的主要组成部分,所以 WebGAL 设计了一个语法糖。如果任何一个脚本的 command 部分无法被解析为任何一种指令,那么 WebGAL 就会将其视为对话。而语音也可以简写其参数,只需要给出文件名即可。如上的对话实际上最终会被解析成 say
指令。
所以,这段对话的真正表示应该为:
say:胸につかえていることを、时は解决してくれない。忘却のラベルを贴るだけで -speaker=森川由绮 vocal=voice_1.ogg;
除此以外,如果对话由一个人物发出,那么在对话人发生改变前,还可以省略人物名称:
森川由绮:胸につかえていることを;
时は解决してくれない;
忘却のラベルを贴るだけで;
对于对话的特殊处理大大提高了脚本编写的效率。
# 语句解析 Ⅳ 参数解析
在 content 后以-
分隔的是附加参数。格外需要注意的是,附加参数的连字符-
前需要有空格,否则 WebGAL 可能会认为这不是一个参数而是一个正常的连字符。
WebGAL 的参数是以 -key=value
的形式表示的,其中,key
的类型为string
,而value
的类型则可以动态决定,并可以以下三种可能的类型存在: string
、number
、boolean
。
比如 -key=s
的value
是 string
;-key=1
的value
是number
,-key=true
或-key=false
的value
是boolean
。
其中,只写出 key
而省略value
的参数会被解析成 -key=true
,这是一个简写的语法糖。这个语法糖非常重要,因为WebGAL 中有一个重要参数 -next
,用于表示在执行完当前语句后立刻执行下一条语句。如果没有省略表示,则每次都需要书写-next=true
。
# 语句解析 Ⅴ 资源处理与预加载
在进行语句解析的时候,就可以获得语句所需要的资源了。比如,bgm
语句一般需要音频资源,playVideo
语句一般需要视频资源,changeBg
语句一般需要图片资源。WebGAL 场景解析器会将所有场景中语句需要的资源合并起来,用于交给预加载器来预加载资源。同时,当遇到形如changeScene
、choose
、callScene
等需要调用子场景的情况时,子场景也会被扫描出,解析并对其中的资源进行预加载。