第二章:用默认的开关与变量做分歧
如果要把RM游戏比作一个人的话,开关与变量就像它的骨骼一样重要。它们是连接事件、转换剧情和构筑数据的重要组成部分,这一点在熟悉了使用基本功能制作游戏之后就能很明显地看出来。关于开关、变量和条件分歧的基本用法在《手把手教你入门RMXP》里已经教过,这里我默认大家都已经掌握了它们的用法。接下来就将教授如何将它们也充分运用到脚本之中,因为对于不太了解脚本的新手而言,它们是最方便的用于改良系统的现成道具。
【脚本里的开关与变量】
1、开关的基本操作
在RMXP里面用事件操作开关是很简单的事情,只要控制它们开和关就可以了。不管是单独一个开关还是许多个开关,基本上涉及的操作也就是这两种——单个开关的On和Off与一定范围内所有开关的On与Off。
在脚本里让单个开关『开』和『关』也是很简单的,只要一句指令就可以解决:
$game_switches[开关编号] = true/false
其中前面的$game_switches就表示『全局开关』这东西,而后面的中括号里则要写上你想要开关的编号——比如1号开关就是$game_switches[1]这样。等号的含义是『赋值』,给开关赋True或者False的『值』,就等同于让开关On或者Off。比如说$game_switches[1] = true,意思就是『打开1号开关』。False则是关闭它。通常情况下如果你打开了一个新工程没有对开关做任何指令的话,所有的开关都是默认False的。(可以在测试游戏时按F9进入Debug模式看到)
让开关打开或关闭的脚本指令和事件的开关操作一模一样,可以在脚本编辑器里写,也可以在RMXP的事件指令第三页最后一个『脚本』里写。如果你在事件指令中写了这句的话,就可以用它替代默认的事件开关操作指令——不过一般情况下,既然都用了事件操作也就没必要以脚本形式来写这句了,这样的语句多数情况下是在脚本编辑器里用到。
$game_switches[开关编号] = true/false
其中前面的$game_switches就表示『全局开关』这东西,而后面的中括号里则要写上你想要开关的编号——比如1号开关就是$game_switches[1]这样。等号的含义是『赋值』,给开关赋True或者False的『值』,就等同于让开关On或者Off。比如说$game_switches[1] = true,意思就是『打开1号开关』。False则是关闭它。通常情况下如果你打开了一个新工程没有对开关做任何指令的话,所有的开关都是默认False的。(可以在测试游戏时按F9进入Debug模式看到)
让开关打开或关闭的脚本指令和事件的开关操作一模一样,可以在脚本编辑器里写,也可以在RMXP的事件指令第三页最后一个『脚本』里写。如果你在事件指令中写了这句的话,就可以用它替代默认的事件开关操作指令——不过一般情况下,既然都用了事件操作也就没必要以脚本形式来写这句了,这样的语句多数情况下是在脚本编辑器里用到。
另外,除了单独操作一个开关之外,也可以用for循环语句同时操作一定范围内多个开关。比如说,就像事件指令里同时打开1~20个开关那样,用脚本也是可以做到的。基本语句是:
for i in a..b(a与b分别表示你的范围的最小值与最大值,注意这里的省略号不是三点是两点。)
$game_switches[i] = true/false (与打开单个开关的语句相同,不过中括号里填的是i不是具体数字)
end
在这三行指令里,for i in a..b 是指『所有在a与b范围内的数字i』,第二句则是表达『编号为数字i的开关都要On/Off』,第三句End是负责给这个循环收尾的完结语句。简单来说这是一个for循环,执行时脚本会挨个把所有符合条件的i号开关都打开(在这里即是指a到b之间的i),然后End。
所以,上面提到的同时打开1~20号的所有开关,用脚本就可以写成
for i in 1..20
$game_switches[i] = true
end
这样1~20号开关就会全部打开,和事件指令的操作是一模一样的。
只要掌握这两种用法,你就可以在脚本编辑器里自由地打开或关闭任何一个或一组开关。
for i in a..b(a与b分别表示你的范围的最小值与最大值,注意这里的省略号不是三点是两点。)
$game_switches[i] = true/false (与打开单个开关的语句相同,不过中括号里填的是i不是具体数字)
end
在这三行指令里,for i in a..b 是指『所有在a与b范围内的数字i』,第二句则是表达『编号为数字i的开关都要On/Off』,第三句End是负责给这个循环收尾的完结语句。简单来说这是一个for循环,执行时脚本会挨个把所有符合条件的i号开关都打开(在这里即是指a到b之间的i),然后End。
所以,上面提到的同时打开1~20号的所有开关,用脚本就可以写成
for i in 1..20
$game_switches[i] = true
end
这样1~20号开关就会全部打开,和事件指令的操作是一模一样的。
只要掌握这两种用法,你就可以在脚本编辑器里自由地打开或关闭任何一个或一组开关。
2、变量的基本操作
在默认的事件指令中,变量的操作比起开关就要稍微多一点。除了代入数字之外,也可以做各种加减乘除的运算操作。而在脚本里还有另一个方便且有趣的用途,就是可以代入字符串。←这个就是事件操作所不能为的部分了,待会儿作为补充进行讲解。
在脚本里,单个变量的语句是$game_variables[变量编号]。如果想要写1号变量,就写成$game_variables[1]即可。对这个变量的各种代入和运算操作,以常量为例在这里进行说明。
$game_variables[1] = 5 (1号变量代入5)
$game_variables[1] += 5 (1号变量加5)
$game_variables[1] -= 5 (1号变量减5)
$game_variables[1] *= 5 (1号变量乘以5)
$game_variables[1] /= 5 (1号变量除以5)
$game_variables[1] %= 5 (1号变量除以5取余数)
在上一章我们已经讲过数字在脚本里的四则运算。在这里对变量的操作联系上章应该已经能很直观地看出来。
要注意做四则运算的时候不要忘记了等号,因为等号是让这个变量『等于某值』的赋值号。当你要做加法运算,写出$game_variables[1] +=5 这句脚本的时候,实际意思是指『让1号变量等于它加上5之后的数值』,所以等号是不可或缺的。写作$game_variables[1] + 5 是错误的。其他的操作也是同理。
等号后面的数值,可以等于任何数字(常量变量均可,正负均可,也可以代入小数),比如你要让1号变量等于2号变量,就可以写成$game_variables[1] = $game_variables[2]。另外比较复杂的运算也可以通过脚本实现——比如你想让8号变量等于2号变量和3号变量的和再乘以5号变量,在事件操作里需要好几步:先让2号变量加3号变量,再乘以5号变量,然后让8号变量等于2号变量(在这几步过程中还让2号变量改变了数值,如果你不想让2号变量变更数值的话还得再用一个新变量先代入2号变量)但用脚本的话只要一个式子就能实现:
$game_variables[8] = ($game_variables[2] + $game_variables[3]) * $game_variables[5]
这样就可以一步到位=v=,而且2号、3号和5号变量的数值都不会改变。小括号可以一层层地嵌套,所以多么复杂的计算式都可以这样写出来。不光在脚本编辑器里,使用事件的脚本操作也可以为自己节省时间。
变量和常量的操作说完了,接下来说说如何给单个变量代入『随机数』——也就是事件指令的变量操作第三条,在某个数值范围之间随便取一个数字,作为某个变量需要代入或参与运算的数值。在脚本语句里,最常用的随机数的语句为rand(n),这句是指『从0到n之间的任意一个数字』。那么,如何随便取一个a到b之间的数值呢?稍微做个简单的算术就能得出结果了:a + rand(b-a) 。
例:让1号变量加上8到20之间的任意一个数字。
$game_variables[1] += 8 + rand(12)
解说:在这里rand(12)这个语句会随机取一个0~12之间的数字,然后前面加上8,就会让这个数字落在8~20的范围之间。
随机数相关也讲完了,接下来是参数部分。依然是按照事件操作指令里的顺序列举下来:
n号物品的所持数:$game_party.item_number(n)
如果你要让1号变量的数值等于1号物品的持有数,那么脚本的写法就是$game_variables[1] = $game_party.item_number(1)。基本上就是把这些参数当作变量来用就可以了。
角色的参数相关:
n号角色的等级:$game_actors[n].level
n号角色的hp:$game_actors[n].hp
n号角色的sp:$game_actors[n].sp
n号角色的经验:$game_actors[n].exp
n号角色的最大hp:$game_actors[n].maxhp
n号角色的最大sp:$game_actors[n].maxsp
n号角色的攻击力:$game_actors[n].atk
n号角色的力量:$game_actors[n].str
n号角色的灵巧:$game_actors[n].dex
n号角色的速度:$game_actors[n].agi
n号角色的魔力:$game_actors[n].int
n号角色的物理防御:$game_actors[n].pdef
n号角色的魔法防御:$game_actors[n].mdef
n号角色的回避率:$game_actors[n].eva
敌人的相关参数也是大同小异,只不过前面的$game_actors[n]要被替换成$game_troop.enemies[n],表示在某支队伍里的几号敌人。
另外敌人是没有等级和经验值这两个参数的。
例如:1号敌人的HP,就写作$game_troop.enemies[1].hp。
解说:$game_troop.enemies[1] —— 1号敌人;.hp —— 的hp。
※hp前的那个点可以理解成『的』。
再接下来是地图的相关参数:
$game_player(角色)/$game_map.events[n](地图上的n号事件)
X坐标:.x
Y坐标:.y
朝向:.direction(这个参数会代入2/4/6/8的其中一个数字,分别代表行走图的上/左/右/下四个方向)
画面X坐标:.screen_x
画面Y坐标:.screen_y
地形标记:.terrain_tag
之所以在这里把语句拆成两段是为了节省地方(喂),如何组合大家看过角色和敌人的组合方式应该能理解一点。
例如:地图上的3号事件的Y坐标,写作$game_map.event[3].y。
例如:角色的地形标记,写作$game_player.terrain_tag
其他的一些参数:
地图ID:$game_map.map_id
同伴人数:$game_party.actors.size
所持金钱数:$game_party.gold
步数:$game_party.steps
游戏时间:Graphics.frame_count / Graphics.frame_rate
计时器当前的剩余时间:$game_system.timer / Graphics.frame_rate
存档次数:$game_system.save_count
到此,事件操作里的所有参数的语句都已经列出。需要用脚本操作变量的时候,只要在这些参数里挑选需要的即可。当然还有一些数值是用事件操作无法代入的,比如游戏里角色的职业、位置、姓名——这些属于『字符串』或者『隐藏数值』之类的东西,用脚本也统统可以代入和操作。
例如:$game_variables[1] = $game_actors[1].name,那么1号变量就会等于角色的名字。
例如:$game_variables[1] = "我是男人",那么一号变量就会等于“我是男人”四个字。
当然,一旦变量等于字符串,就不能进行数值操作了,会出现错误。在上面的例子里1号变量就不能再加减乘除任何数字,不过重新代入别的内容是可以做到的。
另外,字符串本身也可以相加,结果就会是连在一起的一行字。在上面的第二个例子里,如果再写一句$game_variables[1] += "也是基佬",那么1号变量就会变成“我是男人也是基佬”。(……别吐槽这个例子的内容)
需要注意的是:字符串如果作为变量进行操作的话,就只能做加法。乘法和减法之类的其他运算是不能操作的。另外如果参数本身是字符串的话,就不需要加双引号。如果是$game_actors[1].name,就可以直接加上去,因为1号角色的姓名本身就是字符串。
最后,一定范围内的多个变量操作和开关的操作一样,用for循环来完成。
for i in a..b
$game_variables[i] = XXX ←或者替换成任何你需要的变量操作,但一定要记得中括号里填的是i
end
这一段的讲解枯燥了点,而且列出了很多看上去会让人犯晕的语句——不过事实上整体内容一点也不多,只是把两个事件操作指令脚本化,而且这部分对于之后要自己修改和定义系统也是很重要的,是基础。……很难想象你要修改脚本里的战斗系统但是还不清楚要怎么让一个变量等于角色的HP和SP吧?
当然,这些语句也没有必要死记硬背下来,只要在需要用到的时候来查一查就可以了。
练习题:写出下面这些事件指令的脚本语句,放到事件指令第三页的『脚本』中,运行游戏测试来看看是否和默认的事件操作效果相同。(可以用F9的debug模式来看看开关是否打开,代入的数值是否正确等)
A、打开1~20号开关,然后关闭3~8号开关,再然后关闭16号开关。
B、让4号变量等于2号角色的最大HP,减去所持金钱,再乘以3号角色的灵巧值,再除以角色的X坐标。最后让7号变量等于经过这些运算之后的4号变量的9倍。
C、让2~6号变量各自代入99~700之间的一个随机数。
D、让1号变量等于:“考生姓名:【5号角色姓名】 考生职业:【5号角色职业】”
(提示:n号角色的职业参数为$game_actors[n].class。另外空格也可以作为字符串来使用,只要加上双引号。)
(本题参考答案:$game_variables[1] = "考生姓名:【" + $game_actors[5].name + "】 考生职业:【" + $game_actors[5].class +"】")
A、打开1~20号开关,然后关闭3~8号开关,再然后关闭16号开关。
B、让4号变量等于2号角色的最大HP,减去所持金钱,再乘以3号角色的灵巧值,再除以角色的X坐标。最后让7号变量等于经过这些运算之后的4号变量的9倍。
C、让2~6号变量各自代入99~700之间的一个随机数。
D、让1号变量等于:“考生姓名:【5号角色姓名】 考生职业:【5号角色职业】”
(提示:n号角色的职业参数为$game_actors[n].class。另外空格也可以作为字符串来使用,只要加上双引号。)
(本题参考答案:$game_variables[1] = "考生姓名:【" + $game_actors[5].name + "】 考生职业:【" + $game_actors[5].class +"】")
【脚本里的条件分歧指令】
分歧语句在脚本里的重要性就像『条件分歧』在事件指令里一样。如果想要自己定制系统,掌握这类语句的用法是基础中的基础。以下我们介绍几类最常见的条件分歧语句,然后依次来练习它们的用法。
(提示:从这部分起你可以打开F1的帮助手册,找到『脚本入门——基础篇——条件分歧』参考着一起看。帮助手册对这部分的解说还是很简明易懂的。)
1、if分歧语句及运用
打开脚本编辑器找到Scene_Title,12行开始你能看到这样一小段:
# 战斗测试的情况下
if $BTEST
battle_test
return
end
在这里,if~end就是一个条件分歧,表示『当……的时候,执行……;完毕。』——即是说,当if后面的条件被满足的时候,执行所有end前面的内容。在这个例子里,$BTEST是一个全局变量,当我们执行数据库里的战斗测试时该变量为真,那么游戏窗口就会直接执行『battle_test』(测试战斗)这个指令,而不是显示标题画面等。你可以注意到这和事件指令里的条件分歧格式几乎是一模一样的,只不过相对事件指令,你可以在if后面放上各种各样你自己定制的条件,然后在end前写上一旦这些条件满足,将执行什么。
接下来我们继续看Scene_Title第55行的内容:
# 无效的情况下、继续的文字显示为灰色
if @continue_enabled
@command_window.index = 1
else
@command_window.disable_item(1)
end
在这里我们注意到,在if和end的中间多了一个else。这就和事件指令的条件分歧里『除此以外的场合下』是一样的,整个语句表示『当……的时候,执行……;否则执行……;完毕。』。如果你想要设计出条件不满足的情况下另外还要发生什么,就加上这个else表示『否则』的情况,并在其之下添加执行内容。这段脚本的其他语句可以暂时不用管是什么意思,但是要记得if~else~end的这个格式。
另外还有一点要补充的是,对于『否则』的场合下,如果用事件操作就只能表示除了满足条件外的全部情况,即只有『A』与『非A』的两种分歧。但在脚本里,你可以在『非A』的情况下再增加『非B』等情况——这就要用到elsif这个语句。例如:
if $game_variables[1] >= 1
$game_switches[1] = true
elsif $game_variables[1] >= -5
$game_switches[2] = true
else
$game_switches[3] = true
end
对上面这个条件分歧的解说是:当1号变量大于等于1时,打开1号开关。除此以外(1号变量小于1时),当1号变量又大于等于-5时,打开2号开关。再除此以外(1号变量小于-5)时,打开三号开关。完毕。
这样分歧较多的的内容也可以直接用这种方式写出来了。elsif可以不停地接下去,比如你要是再加一句elsif $game_variables[1] >= -10的话,就会再增加一个当1号变量大于等于-10但小于-5的场合。如果用事件或者普通的if来做的话,就要在『除此以外的场合』里再嵌套条件分歧了。所以elsif的作用是很大的,也能让你的条件分歧更有条理性。
快速提问:在上面的实例里,分别回答出当1号变量等于4、等于0、等于-2、等于-15时,分别是哪个开关打开了?
(答案:1号开关、2号开关、2号开关、3号开关。)
上面既然写到了关于判断变量大小的语句,那么就顺便再提一句关于判定数值大小的符号问题。当你要把某个变量与另一个值比较时,『>=』表示大于等于,『<=』表示小于等于,『>』表示大于(超过),『<』表示小于(未满),『!=』表示不等于(以外),『==』(←双等号注意)表示等于。再次强调,判断某变量是否等于一个值要用双等号而不是单等号,一个等号的作用是『赋值』,是不能用在条件分歧里来判定相等与否的。另外在写脚本的时候,保持你的输入法一直是英文输入法。用全角的标点符号肯定要出错。
示例:
1号变量是否大于5:if $game_variables[1] > 5
5号开关是否打开:if $game_switches[5] == true
当前金钱数是否不为零:if $game_party.gold != 0
2号主角姓名是否为『两仪式』:if $game_actors[2].name == "两仪式"
务必注意判定某变量是否等于什么或某开关是否开启关闭的时候,所用的一定是双等号。千万不能写错成单等号—--
——重要的事我得说三遍(……
下面我们做个简单的例子。当1号角色的HP值低于100的时候,按ESC将打不开主菜单。这个用并行公共事件也可以做,不过写脚本会更方便。找到Scene_Map,202行开始有这么一段:
#--------------------------------------------------------------------------
# ● 调用菜单
#--------------------------------------------------------------------------
def call_menu
# 清除商店调用菜单标志
$game_temp.menu_calling = false
# 已经设置了菜单 SE 演奏标志的情况下
if $game_temp.menu_beep
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 清除菜单演奏 SE 标志
$game_temp.menu_beep = false
end
# 矫正主角姿势
$game_player.straighten
# 切换到菜单画面
$scene = Scene_Menu.new
end
我们要在这里加上一个分歧,让菜单画面无法切换。
可以看到注释里『切换到菜单画面』这一行的脚本是『$scene = Scene_Menu.new』,那么我们要让这个语句只在1号角色的HP大于100时执行。于是它就要装在条件分歧的执行部分,而前面则要加上if的条件限制:
if $game_actors[1].hp > 100
$scene = Scene_Menu.new
end
将其改成这样子,保存退出后进行测试吧——让1号角色的HP小于100后,按ESC就无法弹出菜单了。如果你连按键的音效都要消除的话,把这个if再提前一点,放在 if $game_temp.menu_beep的上面,那么连按键音效都会没有了。
练习题A:如果想要让1号角色HP小于100的时候,按键时无法弹出菜单但同时再播放一个警告的音效,如何操作呢?
(提示:播放警告音效的语句是$game_system.se_play($data_system.buzzer_se)。)
练习题B:找到Window_MenuStatus,定义窗口大小的语句部分(忘记的去回顾第一章)。利用if条件分歧判定,当队友数目只有1人时,窗口为目前的1/4那么高;队友数目为2人时,窗口为目前的1/2高;队友数目为三人时,3/4高;除此之外窗口保持原来的高度。(队友数目的变量前面有相关语句可以回去找找看)
2、unless分歧语句及运用
依然是回到Scene_Title。148行开始—--
# 继续无效的情况下
unless @continue_enabled
# 演奏无效 SE
$game_system.se_play($data_system.buzzer_se)
return
end
在这里你就可以看到unless~end的运用。它的指令和if是正相反的,表示『当……不成立时,执行……;完毕。』在这里@continue_enabled其实是『可以继续/继续有效』的意思(enable在英文里的意思是『使能够』),但是前面加上了unless之后,整个语句就是在判定『当继续无效』或者说『除非继续有效,否则』的情况。unless用得最多的情况就是去判断一个开关,或者只有真/否两种可能的变量(通常情况下这也算是一种开关)是否关闭。因为我们前面也讲过,在大多数情况下,只要我们没有刻意写过让开关打开的指令,它们都是关闭着的。
所以假如我们要写1号开关关闭的情况下1号角色的姓名赋为『阿尔西斯』,就可以直接写:
unless $game_switches[1]
$game_actors[1].name = "阿尔西斯"
end
在这里,如果只在条件里写$game_switches[1]的话,其意义和$game_switches[1] == true是一样的。也就是说,这个判定的完整形式是unless $game_switches[1] == true。整个语句可以解读为:『除非1号开关打开;否则1号角色的姓名为阿尔西斯;完毕。』
看起来可能没有if那么直接和直观,但是由于上面提及的,大多数情况下开关都是关闭的,所以用这种条件分歧包括的就是『通常情况下』的事。当然你也可以用if $game_switches[1] == false来判定,效果是一模一样的。
unless语句也可以用else来表示『除此以外』的情况,不过elsif就不能用在这里了这一点要注意。在上面的实例里如果写成
unless $game_switches[1]
$game_actors[1] = "阿尔西斯"
else
$game_actors[1] = "奥斯卡"
end
这样子整个语句的意思就是『除非1号开关打开的时候1号角色的姓名为奥斯卡,否则为阿尔西斯;完毕。』
在这里else就是代表你放在unless之后的那个条件『成立了』的情况下。
试着梳理一下这里的逻辑关系,直到自己能清楚地分辨在unless里的else的场合应该是什么条件。如果对unless语句的前后逻辑搞不清容易混乱的话,就尽量避免使用unless而用if代替吧。
练习题:找到Window_Gold。利用unless语句做出『当队伍里金钱数大于50时用正常字色描绘金钱数量,否则用红色描绘』的分歧。
(对字色的修改语句参考第一章最后的内容。)
3、case条件分歧及运用
Case~when~end这套语句所用的场合,一般是当你需要分歧的数量非常多,而并非单纯的『非A即B』的情况下。通常在菜单选项的脚本里会经常出现这类语句,因为菜单选项往往会有很多个,而case就可以比较简单地分歧出选择每个选项时,需要执行的命令。还是以Scene_Title为例,在94行开始会看到这样的脚本段落:
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 命令窗口的光标位置的分支
case @command_window.index
when 0 # 新游戏
command_new_game
when 1 # 继续
command_continue
when 2 # 退出
command_shutdown
end
end
上头一句if的条件分歧参考注释应该已经能看懂,在下方用到的这段就是case指令。
其中@command_window.index是一个变量,还记得在第一章里我们曾学习过修改过标题画面选项的三个字符串吗?它指代的就是那三个选择项目的『索引』,第一个条目所对应的索引从0开始,所以当选择新游戏的时候,变量数值为0。使用case,就是表示『以这个变量为判断基准』,下接when,表示具体条件。when 0就是指『当@command_window.index为0的时候』,也就是当我们选择了新游戏指令的时候。然后再在下面接上当条件满足的情况时,执行什么命令。这里command_new_game就是一个执行内容,表示进入新游戏。有多少种分歧情况就加多少个when,当然也可以在后面使用else表示『除了上述所有情况以外的场合下』。最后完成分歧使用end,不要忘记加上。
Case分歧在脚本里的用处也很多,在第一章我们曾经学习过如何修改战斗画面的角色战斗图坐标,现在我们用case条件分歧进行更细节的设定。找到Game_Actor的570行,从这段开始:
def screen_x
# 返回计算后的队伍 X 坐标的排列顺序
if self.index != nil
return self.index * 160 + 80
else
return 0
end
end
在if的条件分歧下,我们要改动角色的坐标为特定数字的话,就可以这么修改:
def screen_x
# 返回计算后的队伍 X 坐标的排列顺序
if self.index != nil
case self.index
when 0
return 400
when 1
return 450
when 2
return 480
else
return 500
end
else
return 0
end
end
数值我只是随便一取,但是已经应该能够看出来使用了case之后坐标变得更加直观化——队伍里第一个角色的X坐标就是400,第二个角色的X坐标就是450,以此类推。由于默认的RMXP队伍里最大4人,所以当when 2(第三个角色的场合)结束之后只要加个else其实就能代表『当第四个角色的场合』了。同理可以对Y坐标进行修改,这样就可以达到自由定制你的战斗角色图坐标的目的。
case的判断目标是变量,而我们在前面学过,变量是可以代入字符串的。所以case也可以拿来判断字符串。比如1号角色如果会经常改名字的话,可以根据不同的名字来做一些特殊的内容。类似:
case $game_party.actors[1].name
when "阿尔西斯"
执行内容1
when "爱德华"
执行内容2
else
执行内容3
end
这样的分歧也是可以做的。
Case和其他的条件分歧一样,是如果你的变量不符合其中所有的条件,就会直接跳过整个分歧执行下面内容的。所以虽然说不一定非要用else,但如果你希望包括所有的情况的话还是可以加上else的。当然End是无论任何情况下都不能少的……(别罗嗦)
练习题A:在『Game_Actor』里自行练习修改角色的战斗图坐标。
练习题B:找到Spriteset_Map,149行。在RM里画面震动默认为水平震动(@viewport1.ox控制水平震动的幅度,而@viewport1.oy则控制垂直震动的幅度),利用case分歧,做出一个简单的利用1号变量来控制震动模式的效果。当1号变量为0时水平震动,当1号变量为1时垂直震动,当1号变量为2时水平和垂直都有震动(乱晃效果)。当成功之后,可以追加些分歧来设置不同的震幅(比如在$game_screen.shake后面*2或追加其他语句)
4、多个条件的连接:and、or、not
这是一点附加的内容——当大家熟悉了条件分歧之后,可以使用这三个连接语句来简化或加强你的分歧结构。这些连接语句多用于if和unless分歧,不要将它们用在case语句里面。
And是表示『且』的情况,A and B就是当A和B同时成立的情况下。比如说if $game_variables[1] == 1 and $game_variables[2] == 1 ,就是指当1号变量为1和2号变量为1同时成立时,之后的条件才能成立。如果对这一整个连接起来的条件分歧里加上else,就表示『只要它们不是同时等于1』的场合,else下的内容都成立。在不出现数学矛盾的前提下(比如一个开关同时又开又关,一个变量又等于5又等于8),and可以一直追加,需要同时成立的条件也会越来越多。
Or是表示『或』的情况,A or B就是指当两个条件成立其一,下面的内容就可以执行。如果上面的例子是if $game_variables[1] == 1 or $game_variables[2] == 1,那么就是只要1号和2号变量里任何一个等于1,条件就都会成立了。如果对这个连接起来的条件加上else的场合下,则表示『当它们都不等于1』的场合。同样,or也是可以追加的,而只要你连接出来的条件里有一个符合要求,下面的内容就可以执行。
Not是表示『否』的情况,多用于某个条件在通常情况下没有成立的场合,有点类似unless。因为该条件通常是不成立的;所以一旦成立,就要有点特殊的事儿干。用法是if not和unless not,表示的就是『当非A』的条件下,执行内容。else就很简单啦,不用再解释也能明白。
要注意这些语句互相之间也可以搭配使用,这种时候,可以用括号把一类情况合并在一起。比如说下面的例子:
if ($game_variables[1] == 1 and $game_variables[2] == 2) or $game_switches[2] == true
执行内容
end
在这个例子里,括号里括起来的内容就是两个并列条件被and连接后成为一整个大的条件,再被放在or连接里跟后面的条件进行并列判断,整个分歧表示的意思是『当1号变量等于1同时2号变量等于2,或者2号开关打开的时候,执行内容』。
快速提问:
A、当1号变量为1,2号变量为2的时候条件成立吗?
B、当2号开关关闭的时候条件成立吗?
C、当2号变量等于4的时候条件成立吗?
答案分别是:A、成立; B、取决于1号变量是否等于1和2号变量是否等于2; C、取决于2号开关是否打开。
(你答对了吗?❤←❤你妹啊滚)
连接语句要用得很复杂就需要比较强大的逻辑思维。在脚本编辑器里也会有很多用到它们的地方,比如Game_Switches里,你可以找到这样的内容:
if switch_id <= 5000 and @data[switch_id] != nil
return @data[switch_id]
else
return false
end
这个就是在限制开关的最大数量,介于5000个和『无』之间的开关会返回其ID。换句话说$game_switches[5001]就不能用了。如果你想要更多开关就可以把5000改为9999,这样就有9999个开关可用。(修改这个是第一章的内容了所以不再多说,主要注意这里的and用法)
同理,or也是会有不少地方在用到,比如Game_Character 2里面177行的if jumping? or moving?,就是在判断角色是否在移动中(跳跃中,或者行走中),因为这两种情况任何一种都算在『移动』的范畴,所以都需要考虑进去。
对这部分的附加内容暂时不出练习题,有兴趣练习的话可以拿事件的脚本指令自己研究一下。当然对它们的用法还是要熟悉。
截止到这里,基础的脚本分歧和变量开关的相关知识差不多就讲完了。下一章开始将会进入较正式的脚本应用,学习如何移花接木地用现成的脚本,打造出简单的自定义的内容。
===本章结束===
===本章结束===