本指南将教你如何为自己的自定义关卡编写脚本。
什么是脚本?
如果你已经了解《VVVVVV》的脚本工作原理,只是想查找函数参考,可以跳过此部分。
脚本是为关卡添加高级功能的一种方式,无论是对话、过场动画还是复杂的游戏机制。脚本本质上是一系列代码行,当进入脚本框或与终端交互时执行。
标准的脚本编写方法(称为“简化脚本”)简单易用,但功能有限。若要实现更复杂的功能,你可以使用内部脚本,但这种方式更容易出错且操作难度更大。本指南将详细解释所有简化功能,并简要说明一些常见的内部脚本功能。
VED
虽然《VVVVVV》内置的关卡编辑器运行良好,但有一些外部工具可以极大地提高你的制作效率。其中最著名的可能就是VED。VED提供了各种用于制作更好关卡的工具,尤其是在脚本编写方面。
制作和编辑脚本
假设你已经了解编辑器的基本操作,那么这部分内容对你来说应该不难。
选择【终端】工具(快捷键:T)或【脚本框】工具(快捷键:Y)。终端是一种类似电视的可交互对象。歌曲标题 简化版ID 内部ID
寂静(停止音乐) 0 无
勇往直前(太空站) 1 1
正能量(高塔) 2 2
无限可能(实验室) 3 3
探索热情(外部区域) 4 4
VVVVVV开场曲(标题画面) 5 6
命中注定(幕间) 6 8
流行集锦(制作人员名单) 7 10
白日梦(秘密实验室) 8 11
压力 cooker(扭曲区域) 9 12
节奏能量(未使用) 10 13
刺破天空(未使用) 11 14
路径完成(收集品) 无 0
暂停 无 5
全会(结局) 无 7
ecroF evitisoP(未使用) 无 9
命中注定混音版(终章) 见下方说明* 15
*若要在简化脚本中播放,请使用“playremix”命令
脚本示例
脚本很适合用来尝试各种效果,但它们具体应该在什么时候使用呢?以下是一些脚本示例及其功能说明。此脚本用于播放一段对话场景,其中朱红与翠绿进行对话,每位船员的对话框之间有短暂停顿。
say(2,red)
欢迎来到VVVVVV!这是一款平台跳跃游戏,不过你不能跳跃,只能翻转。
delay(10)
reply(1)
哦,听起来挺酷的。
delay(10)
say(2,red)
简直太棒了!真想知道是谁想出了这么个点子?
这两个脚本会检查标记16是否激活。如果激活,就会移除重力线,让玩家能够继续前进。如果未激活,维多利亚会告诉玩家去和附近某处的终端对话。
ifflag(16,remove_lines_script)
say(2,blue)
看来我们漏掉了什么东西。试着在附近找找终端吧。
remove_lines_script:
destroy(gravitylines)
flash
这三个脚本会检查标记44是否激活。如果是这样,系统将激活一个脚本,检查玩家是否已拥有5个饰品。若玩家拥有5个饰品,房间内所有传送代币将被销毁,音乐将切换为【Pressure Cooker】并伴随闪光效果。若任何检查失败,终端会提示玩家。
sc1:
ifflag(44,sc2)
say(1,grey)
标记检查失败。
sc2:
iftrinkets(5,sc3)
say(1,grey)
饰品检查失败。
sc3:
destroy(warptokens)
music(9)
flash
内部脚本
内部脚本是基础游戏使用的系统。它并非为关卡编辑器设计,但有一些变通方法可以访问。强烈建议使用VED进行内部脚本编写。本指南不涉及如何在标准编辑器中使用内部脚本。以下是一些内部命令的基本列表。有关更完整的列表,请前往相关网站。
警告:内部脚本存在危险!你应查看VED中的内部命令列表或相关网站,确认你想使用的功能是否存在风险!为将危险降至最低,请使用最新版本的游戏。
createentity:创建实体。有时需要非常特定的参数才能生效。
createentity(x,y,n,a,b)
x = 像素单位的X坐标
y = 像素单位的Y坐标
n = 实体ID
a = 属性1
b = 属性2
cutscene:使过场动画黑边出现。
cutscene()
endcutscene:使过场动画黑边消失。
endcutscene()
flash:使屏幕闪烁。与简化脚本不同,此命令不会播放声音或使屏幕震动。
flash(n)
n = 闪烁持续的刻数
gotoposition:在当前房间内设置维里迪恩的位置和重力方向。请注意,(0, 0)位于左上角。
gotoposition(x,y,g)
x = x坐标(像素),从0开始
y = y坐标(像素),从0开始
g = 重力(0 = 正常,1 = 翻转)
gotoroom立即将维里迪安移动到另一个房间。请注意,(0, 0)位于左上角。
gotoroom(x,y)
x = 房间x坐标,从0开始
y = 房间y坐标,从0开始
ifexplored如果房间已探索(在地图上可见),则运行脚本
ifexplored(x,y,s)
x = 房间x坐标,从0开始
y = 房间y坐标,从0开始
s = 要运行的脚本
do开始循环。运行代码直到“loop”命令达到指定次数
do(n)
n = 循环次数
loop结束由“do”开始的循环
loop
play播放音乐曲目。播放(n)
n = 音乐曲目ID(参见列表参考部分)
播放音效
播放音效(n)
n = 音效ID(使用VED或在线搜索音效ID列表)
屏幕震动
屏幕震动(n)
n = 震动持续的滴答数
等待过场动画边框
等待过场动画边框()
课程结束
好了,现在你应该已经掌握了制作自己脚本所需的全部知识。当然,如果你打算发布自己的关卡供他人游玩,那么在编写内容时要合理适度。
编程愉快!脚本区域是进入时会触发脚本的不可见区域。
放置终端会立即提示你输入脚本名称,但脚本区域需要你先定义左上角和右下角。
输入脚本名称。名称要简短但有意义,因为这是你之后引用脚本的方式。输入现有脚本的名称可以将同一脚本链接到多个对象。按回车键关闭提示。
创建脚本后,打开菜单并选择【编辑脚本】。(警告:画面会非常亮。)这将打开脚本列表,你可以从中选择要编辑的脚本。
进入编辑器后,就可以开始编写脚本了!
简化功能
2.4版本中可用的所有简化脚本功能say
创建文本框。用于创建对话段落。此命令后的行包含将在文本框中显示的文本。确保行数与传递给函数的数字相等。如果两个参数都留空,将默认使用1行和灰色。
say(n,c)
n = 文本行数。必须与你输入的行数匹配。
c = 文本框颜色。可选颜色:青色、红色、蓝色、绿色、黄色、粉色、灰色
reply
与say类似,但用途略有不同。它始终设置为青色,并且优先显示玩家角色Viridian而非船员Viridian。(你可以将Viridian放置为船员,而颜色设为青色的say命令会将文本框放置在船员Viridian附近。)若参数留空,默认值为1行。
reply(n)
n = 文本行数
delay暂时暂停脚本。延迟结束前,下一个函数不会执行。延迟以“ticks”为单位,大约30 ticks等于1秒(准确来说,30 ticks实际为1.02秒)
delay(n)
n = 等待的ticks数
flash使屏幕闪烁并播放传送器使用的音效。无参数。
flash
music更改当前正在播放的音乐曲目。
music(n)
n = 音乐曲目ID(曲目ID列表请参考“列表参考”部分)
playremix播放“Predestined Fate Remix”音乐曲目,该曲目在最终关卡播放。无参数。
playremix
destroy这将销毁房间内该对象的所有实例。destroy(x)
x = 要销毁的对象名称。可以是“warptokens”“gravitylines”“moving”或“disappear”。“platforms”也是一个选项,但不建议使用,因为可能会导致异常行为。
happy
让船员开心。
happy(c)
c = 颜色(颜色列表请参见列表参考部分,或使用“all”来影响所有人)
sad
让船员难过。
sad(c)
c = 颜色(颜色列表请参见列表参考部分,或使用“all”来影响所有人)
squeak
这会让船员发出吱吱声(说话声)。
squeak(c)
c = 颜色(颜色列表请参见列表参考部分,或使用“on”使其在文本框出现时触发)
speaker
设置使用say命令创建的下一个文本框的颜色和位置。这可以用来替代向say命令传递第二个参数。speaker(c)
c = 颜色(颜色列表请参考列表参考部分)
flag设置旗帜状态。
flag(n,v)
n = 旗帜编号(0-99中的任意数字)
v = 状态("on"表示开启,"off"表示关闭)
ifflag检查旗帜状态,若旗帜为开启状态则运行另一个脚本,否则正常继续。
ifflag(n,s)
n = 旗帜编号(参见"flag"函数)
s = 要运行的脚本
iftrinkets检查玩家是否收集了特定数量的饰品。如果是,则运行另一个脚本。否则脚本将继续,另一个脚本不会运行。iftrinkets(n,s)
n = 要检查的收集品数量(这是最小值,因此如果玩家拥有的数量超过此值,仍会运行第二个脚本)
s = 要运行的脚本
iftrinketsless检查玩家收集的收集品是否少于特定阈值。如果是,则运行另一个脚本。否则,脚本将继续运行,另一个脚本不会运行。
iftrinketsless(n,s)
n = 要检查的收集品数量(这是最小值,因此如果玩家拥有的数量超过此值,仍会运行第二个脚本)
s = 要运行的脚本
map切换地图的可见性。其工作方式类似于基础游戏中的间歇关卡。
map(s)
s = 开启/关闭
warpdir更改房间内的传送方向。warpdir(x,y,d)
x = 目标房间X坐标
y = 目标房间Y坐标
d = 传送方向(0=无传送,1=水平,2=垂直,3=全方向)
ifwarp
检查特定房间的传送方向。如果与提供的方向匹配,则运行另一个脚本。否则,脚本正常继续。
ifwarp(x,y,d,s)
x = 目标房间X坐标
y = 目标房间Y坐标
d = 传送方向(0=无传送,1=水平,2=垂直,3=全方向)
s = 要运行的脚本
loadtext
通过语言代码加载关卡的翻译(例如,“fr”或“pt_BR”)
loadtext(c)
c = 语言代码
iflang
如果VVVVVV设置中设置的语言(不受loadtext影响)等于c,则运行另一个脚本。
iflang(c,s)
c = 语言代码
s = 要运行的脚本
setfont
更改文本使用的字体。留空可恢复为默认字体。
setfont(f)
f = 字体
setrtl切换文本右对齐。默认关闭。
setrtl(b)
b = "on"(开启)或"off"(关闭)
textcase即将推出
列表参考
本部分包含对接受枚举值的函数选项的参考。
颜色
名称 船员 青色 翠绿色 红色 朱红色 绿色 铜绿色 蓝色 维多利亚蓝 黄色 蛋黄色 粉色 紫罗兰色 灰色 不适用
音乐曲目注意:简化脚本和内部脚本使用不同的ID来引用音乐曲目。此表格包含两种ID。