当前位置:首页 > RMXP初初级脚本教程
这样子整个语句的意思就是『除非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?,就是在判断角色是否在移动中(跳跃中,或者行走中),因为这两种情况任何一种都算在『移动』的范畴,所以都需要考虑进去。
对这部分的附加内容暂时不出练习题,有兴趣练习的话可以拿事件的脚本指令自己研究一下。当然对它们的用法还是要熟悉。
截止到这里,基础的脚本分歧和变量开关的相关知识差不多就讲完了。下一章开始将会进入较正式的脚本应用,学习如何移花接木地用现成的脚本,打造出简单的自定义的内容。
改改脚本第三章:利用现有物打造自己的Window和Scene
改改脚本第四章:模仿与再创造——增加自定义参数
改改脚本第五章:修改Window_Message,实现对话特效
改改脚本第六章:Scene_Battle的小手术们
改改脚本最终章:虽然我们是笨鸟,但我们也能慢慢飞
共分享92篇相关文档