原文由 66RPG 的 SailCat 等人编写,并由ML4455739改编。
您可以按Ctrl+F打开浏览器自带的搜索功能。在最底端有文档下载,点此直达。
什么是事件脚本:即RPG Maker系列软件中,在事件指令的第三页的最后一项——“脚本”,条件分歧中的最后一个选项,以及设置移动路线指令的最后一个选项,这三处所可以使用的 简单语句。利用事件脚本实现原有事件的功能是脚本的基础知识,此外还可实现对原有功能的扩展。您可以将这篇文章复制到您工程的脚本编辑器中供随时查 阅。=begin =end和井号#规定内容为注释,不会对您的游戏造成任何影响。
#=======================================================#
# 事件指令第一页
#=======================================================#
1、显示文章
语句:$game_temp.message_text = "文字"
示例:$game_temp.message_text = "啊啊啊!"
效果:会出现一个对话框写着“啊啊啊!”,就如同正常的显示文章
注意:引号为封闭的英文引号,即"",而不是中文引号“”
2、更改对话框位置
语句:$game_system.message_position = 数字
示例:$game_system.message_position = 1
效果:这个数字代表的是对话框的显示位置,默认的只有三个位置,0代表在上面显示,1代表中间,2代表下面
3、更改对话框透明度
语句:$game_system.message_frame = 数字
效果:这里的数字只能是0或者1,0代表完全不透明,1代表完全不透明
4、等待
语句:@wait_count = 等待帧数
示例:@wait_count = 30
效果:等待30帧(也许是15吧?)
5、调用公共事件
语句:$game_temp.common_event_id = 公共事件的编号
示例:$game_temp.common_event_id = 1
效果:调用一号公共事件
6、开关操作
语句:$game_switches[变量编号] = true/false
示例:$game_switches[1] = true
效果:打开一号开关,true代表打开开关,即真,而false则代表关闭开关,即伪
7、变量操作
变量操作和别的操作相比有所不同,因为变量可以代入很多东西~
语句:$game_variables[变量编号] = 变量数值
示例:
$game_variables[1] = 16 # 把1号变量的数值代入成16
$game_variables[1] = $game_variables[2] # 让1号变量的数值等于2号变量的数值
$game_variables[1] = rand(60) # 1号变量等于0到59之间的某个随机数
注意:rand这一函数在使用时,产生的数字是不可能包含括号中的数字(即上限本身)的
$game_variables[1] = $game_actors[1].hp # 1号变量的数值等于1号角色的HP值
$game_variables[1] = $game_actors[1].sp # 1号变量的数值等于1号角色的SP值
$game_variables[1] = $game_party.item_number(1) # 1号变量的数值等于1号道具的数量
$game_variables[1] = $game_variables[2] + 18 # 让1号变量的值成为2号变量的值加上18的结果
$game_actors[角色编号].hp # 指定编号的角色的HP
$game_actors[角色编号].sp # 指定编号的角色的SP
$game_actors[角色编号].maxhp # 指定编号的角色的最大HP
$game_actors[角色编号].maxsp # 指定编号的角色的最大SP
$game_actors[角色编号].exp # 指定编号的角色的经验值
$game_actors[角色编号].level # 指定编号的角色的等级
$game_actors[角色编号].class_id # 指定编号的角色的职业编号
$game_actors[角色编号].weapon_id # 指定编号的角色的武器编号
$game_actors[角色编号].armor1_id # 指定编号的角色的盾牌编号
$game_actors[角色编号].armor2_id # 指定编号的角色的头部防具编号
$game_actors[角色编号].armor3_id # 指定编号的角色的身体防具编号
$game_actors[角色编号].armor4_id # 指定编号的角色的装饰品编号
$game_actors[角色编号].str # 指定编号的角色的力量
$game_actors[角色编号].dex # 指定编号的角色的灵巧
$game_actors[角色编号].int # 指定编号的角色的魔力
$game_actors[角色编号].atk # 指定编号的角色的攻击力
$game_actors[角色编号].pdef # 指定编号的角色的物理防御
$game_actors[角色编号].mdef # 指定编号的角色的魔法防御
$game_actors[角色编号].eva # 指定编号的角色的回避修正
$game_troop.enemies[敌人编号].hp # 指定编号的敌人的HP,
类比:敌人的$game_troop.enemies[敌人编号]与角色的$game_actors[角色编号]类似,
即hp、sp、maxhp、str、int、atk等这些角色的属性,敌人也是有的
$game_player.x # 角色的地图x坐标
$game_player.y # 角色的地图y坐标
$game_player.direction # 角色的朝向,下/左/右/上分别返回2/4/6/8
$game_player.screen_x # 角色的屏幕x坐标
$game_player.screen_y # 角色的屏幕y坐标
$game_player.terrain_tag # 角色的地形标志,地形标志需要在数据库中设置
$game_map.map_id # 当前地图的地图ID
$game_map.events[事件编号].x # 指定编号的事件的地图x坐标
类比:和$game_player相关的东西都可以换成和地图的某个事件相关,
将$game_player换成$game_map.events[事件编号]即可,若对象是本事件则事件编号处直接写@event_id
$game_party.actors.size # 同伴人数
$game_party.steps # 步数
$game_party.gold # 所持金钱
Graphics.frame_count / Graphics.frame_rate # 游戏总时间(秒)
$game_system.timer / Graphics.frame_rate # 计时器时间(秒)
$game_system.save_count # 存档次数
8、计时器操作
语句:$game_system.timer = 计时器的时间秒数 * Graphics.frame_rate
要操作计时器,必须先设定计时器的时间,也就是上面的语句,然后使用
语句:$game_system.timer_working = true
该语句来启用计时器,关闭计时器则使用$game_system.timer_working = false
9、增减金钱
语句:$game_party.gain_gold(金钱数量)
语句:$game_party.lose_gold(金钱数量)
示例:
$game_party.gain_gold(100)
$game_party.lose_gold(100)
减少金钱的方法括号中也填正整数
10、增减物品
语句:$game_party.gain_item(物品编号,增加数量)
语句:$game_party.item_number(物品编号) += 数量
语句:$game_party.lose_item(物品编号,减少数量)
语句:$game_party.item_number(物品编号) -= 数量
示例:$game_party.gain_item(1,2)
这就是获得两个一号物品
示例:$game_party.lose_item(3,1)
这就是减少一个三号物品
注意:在括号中需要多个参数的时候,各参数之间以英文逗号,相隔而非中文逗号,下同
11、增减武器
和增减物品道理相同,只是把所有的item换成了weapon,操作方法和原理都相同。
语句:$game_party.gain_weapon(武器编号,增加数量)
语句:$game_party.weapon_number(武器编号) += 数量
语句:$game_party.lose_weapon(武器编号,减少数量)
语句:$game_party.weapon_number(武器编号) -= 数量
示例:$game_party.gain_weapon(1,2)
这就是一号武器增加两个
示例:$game_party.lose_weapon(3,1)
这就是三号武器减少一个
12、增减防具
和增减物品道理相同,只是把所有的item换成了armor,操作方法和原理都相同。
语句:$game_party.gain_armor(防具编号,增加数量)
语句:$game_party.armor_number(防具编号) += 数量
语句:$game_party.lose_armor(防具编号,减少数量)
语句:$game_party.armor_number(防具编号) -= 数量
示例:$game_party.gain_armor(1,2)
就是一号防具增加两个
示例:$game_party.lose_armor(3,1)
这就是三号防具减少一个
13、替换队员
语句:$game_party.add_actor(角色编号)
效果:加入指定编号的队员
语句:$game_party.remove_actor(角色编号)
效果:让指定编号的队员离队
语句:$game_party[角色编号].setup(角色编号)
效果:让指定编号的队员初始化
示例:
$game_party.add_actor(1)
$game_party[1].setup(1)
效果:就是在队伍中加入1号角色并且其初始化
14、更改窗口皮肤
语句:$game_system.windowskin_name = "窗口皮肤文件的名称"
示例:$game_system.windowskin_name = "01"
效果:把当前的窗口皮肤文件换成一个叫做01的窗口皮肤文件,窗口皮肤文件位于Windowskins文件夹
15、更改禁止存档
语句:$game_system.save_disabled = true/false
示例:$game_system.save_disabled = true
效果:为true代表禁止存档,false代表可以存档
16、更改禁止菜单
语句:$game_system.menu_disabled = true/false
效果:true代表禁止呼出菜单,false代表可以呼出菜单
17、更改禁止遇敌
语句:$game_system.encounter_disabled = true/false
效果:true代表禁止遇敌,false代表可以遇敌
#=======================================================#
# 事件指令第二页
#=======================================================#
18、设置事件位置
语句:$game_map.events[事件编号].moveto(地图x坐标,地图y坐标)
示例:$game_map.events[3].moveto(5,6)
效果:就是把3号事件移到地图的5,6坐标的位置上
19、画面卷动
语句:$game_map.start_scroll(卷动方向, 卷动距离, 卷动速度)
注意:2/4/6/8代表卷动方向下/左/右/上,距离自定,但不能别卷出地图,速度一般为1到6,更大的数可能太快了
示例:$game_map.start_scroll(4,5,3)
效果:让画面以慢速(3是慢速)向左(4)卷动5格
20、显示动画
语句:$game_player.animation_id = 动画编号
示例:$game_player.animation_id = 3
示例:$game_map.events[1].animation_id = 3
效果:上为在角色身上显示3号动画,下为在本地图的1号事件身上显示3号动画
21、角色透明
语句:$game_player.transparent = true/false
效果:true代表角色透明,false代表角色不透明
22、等待移动结束
语句:@move_route_waiting = true
23、更改画面色调
语句:$game_screen.start_tone_change(Tone.new(红色调,绿色调,蓝色调,灰度),时间)
示例:$game_screen.start_tone_change(Tone.new(0,0,0,255),20)
效果:在20帧的时间内将画面色调渐变为灰色(黑白场景用)
24、画面闪烁
语句:$game_screen.start_flash(Color.new(红色调,绿色调,蓝色调,强度),时间)
示例:$game_screen.start_flash(Color.new(255,255,0,255),2)
效果:持续2帧的黄色闪烁
25、画面震动
语句:$game_screen.start_shake(震动强度,震动速度,震动时间)
强度和速度一般为1到9,当然也可以更大
示例:$game_screen.start_shake(9,9,20)
效果:以9的强度9的速对火动画面20帧
26、显示图片
语句:$game_screen.pictures[图片编号].show("图片名字", 原点, 画面x坐标, 画面y坐标, x轴放大率, y轴放大率, 不透明度, 显示方式)
示例:$game_screen.pictures[1].show("BunnyGod", 1, 320, 240, 100, 100, 255, 0)
效果:在画面中心显示一张正常大小,完全不透明,显示方式为正常,编号为1的叫做BunnyGod的图片
注意:图片名字是要显示的图片的文件名,
原点就是显示图片的原点位置,0代表左上,1代表中心,
画面的x坐标和y坐标就是图片原点的画面的x坐标和画面y坐标,
在XP中画面X坐标为0~640,画面Y坐标是0~480,VX和VA则不同,
x轴放大率和y轴放大率就是以原点为中心的x方向和y方向放大率,100为正常大小,
不透明度就是图片的不透明度,为0到255,0为完全透明,255为完全不透明,
显示方式其实就是图片的合成方式,0是正常,1是加法,2是减法
27、移动图片
语句:$game_screen.pictures[图片编号].move(移动时间, 原点, 画面x坐标, 画面y坐标, x轴放大率, y轴放大率, 不透明度, 显示方式)
示例:$game_screen.pictures[1].move(20, 0, 0, 0, 100, 100, 0, 0)
效果:在20帧内移动编号为1的图片并让其渐渐消失
注意:原理和显示图片一样,由于图片已经显示,所以原本的图片名字也变成了移动时间。图片的移动是渐变式的,不仅是位置,图片的大小和透明度也会跟着一起渐渐变化,这个一般是用来做淡出和淡入图片用
28、旋转图片
语句:$game_screen.pictures[图片编号].rotate(旋转速度)
示例:$game_screen.pictures[1].rotate(18)
效果:让一号图片以每帧18度的速度旋转
注意:旋转速度是图片在每1帧内的旋转角度,而不是“速度”,旋转角度大了自然速度看起来就快,该值可为负数,用来决定旋转的方向。正数是顺时针转,负数是逆时针转。特别注意:使用旋转图片可能导致游戏的运行效率严重的下降
29、图片消失
语句:$game_screen.pictures[图片编号].erase
示例:$game_screen.pictures[1].erase
效果:让编号为1的图片直接消失
30、准备渐变
语句:Graphics.freeze
31、执行渐变
语句:Graphics.transition(时间, "Graphics/Transitions/渐变图形名称")
示例:Graphics.transition(20, "Graphics/Transitions/01")
效果:在20帧内用渐变图形“01”的图案渐变
32、播放BGM
语句:Audio.bgm_play("Audio/BGM/音乐文件名", 音量, 频率)
示例:Audio.bgm_play("Audio/BGM/Hello", 100, 100)
效果:让名为Hello的音乐文件以背景音乐形式正常的播放
注意:音量太大或与音效不协调可能导致极糟糕的游戏体验
33、播放BGS
语句:Audio.bgs_play("Audio/BGS/音乐文件名", 音量, 频率)
原理和播放BGM相同,只是所有的bgm被改成了bgs
35、播放ME
语句:Audio.me_play("Audio/ME/音乐文件名", 音量, 频率)
原理和播放BGM相同,只是所有的bgm被改成了me
35、播放SE
语句:Audio.se_play("Audio/SE/音乐文件名", 音量, 频率)
原理和播放BGM相同,只是所有的bgm被改成了se
36、记忆BGM/BGS
语句:$game_system.bgm_memorize
语句:$game_system.bgs_memorize
效果:一个是记忆BGM,一个是记忆BGS,可以分开来用
37、还原BGM/BGS
语句:$game_system.bgm_restore
语句:$game_system.bgs_restore
效果:同记忆,也可以分开来用。
38、停止SE
语句:Audio.se_stop
39、天候设置
语句:$game_screen.weather(类型, 强度, 时间)
类型0是没有,1是雨,2是风,3是雪,强度为1到9
示例:$game_screen.weather(1, 9, 10)
效果:在10帧的时间里将天气变为暴雨
#=======================================================#
# 事件指令第三页
#=======================================================#
40、增减角色的HP,SP等能力相关数值
语句:$game_actor[角色编号].hp += 数值
效果:让指定编号角色的生命值增加你想要的数值。同理也可以运用在sp,exp,str等等数值上
注意:如果使用这个指令来减少HP(即把+=改为-=),即使角色的HP为0也不会挂掉
示例:$game_actor[2].level += 5
效果:让2号角色的等级提升5级
41、完全回复
语句:$game_actors[角色编号].recover_all
示例:$game_actors[1].recover_all
效果:就是让一号角色完全恢复
42、增减特技
语句:$game_actors[角色编号].learn_skill(特技编号)
效果:指定编号的角色习得指定编号的特技
语句:$game_actors[角色编号].forget_skill(特技编号)
效果:指定编号的角色遗忘指定编号的特技
示例:$game_actors[3].learn_skill(32)
效果:让3号角色习得32号特技
43、变更装备
语句:$game_actors[角色编号].equip(装备类型, 要替换的装备的编号)
装备类型0代表武器,1代表盾,2代表头部防具,3代表身体防具,4代表装饰品
示例:$game_actors[4].equip(0, 2)
效果:把4号角色的武器换为2号武器
注意:和事件一样,若没有那个装备的话,是不可能装备上的。若要卸下装备,就把要替换的装备的编号填0
44、变更角色图形
语句:
$game_actors[角色编号].set_graphic("行走图图片", 行走图色调, "战斗图图片", 战斗图色调)
$game_player.refresh
示例:
$game_actors[1].set_graphic("God", 0, "Lord", 0)
$game_player.refresh
效果:让1号角色的行走图为普通色调的God,战斗图也是普通色调的Lord
注意:$game_player.refresh是为了立刻刷新主角的形象,不然在指令执行后是不会立刻变化的
45、战斗中断
语句:$game_temp.battle_abort = true
46、呼叫商店
语句:$game_temp.shop_calling = true
47、呼叫菜单画面
语句:$game_temp.menu_calling = true
48、呼叫存档画面
语句:$game_temp.save_calling = true
49、游戏结束
$game_temp.gameover = true
50、返回标题画面
语句:$game_temp.to_title = true
语句:$scene = Scene_Title.new
效果:都是返回标题画面,其他上面的也似乎都可以用
$scene = Scene_Shop.new、$scene = Scene_Menu.new、$scene = Scene_Save.new代替
51、暂时消除事件
语句:$game_map.events[事件编号].erase
示例:$game_map.events[1].erase
效果:暂时消除1号事件
52、更改地图设置
语句:
$game_map.panorama_name = "全景图形的名字"
$game_map.panorama_hue = 数字(0-255)
$game_map.fog_name = "雾图形的名字"
$game_map.fog_hue = 数字(0-255)
$game_map.fog_opacity = 数字(0-255)
$game_map.fog_blend_type = 数字(0普通,1加法,2减法)
$game_map.fog_zoom = 数字
$game_map.fog_sx = 数字
$game_map.fog_sy = 数字
$game_map.battleback_name = "战斗背景图片名"
$game_temp.battleback_name = "战斗背景图片名"
实现事件指令中更改地图的三个属性:全景图形,雾图形,战斗背景。
示例:
$game_map.panorama_name = "001"
$game_map.panorama_hue = 0
效果:将当前地图的全景图形改成文件名为001,全景图形文件在Panoramas文件夹
示例:
$game_map.fog_name = "002"
$game_map.fog_hue = 0
$game_map.fog_opacity = 128
$game_map.fog_blend_type = 0
$game_map.fog_zoom = 100
$game_map.fog_sx = 0
$game_map.fog_sy = 0
效果:将当前地图的雾图形改成文件名为002,正常色调,半透明,合成方式为普通,正常大小,
原点为(0,0)的雾图形,雾图形文件都放在Fogs文件夹里
示例:
$game_map.battleback_name = "003"
$game_temp.battleback_name = "003"
效果:将当前地图的战斗背景文件改成文件名为003,正常色调的战斗背景,
战斗背景文件都放在Battlebacks文件夹里
注意:$game_map.battleback_name是修改了地图属性,但如果是在战斗中调用事件脚本,仅写这一行不够,
因为战斗背景是读取$game_temp.battleback_name的,在每次战斗开始的时候都会自动让这个
$game_temp.battleback_name = $game_map.battleback_name,但是在战斗中途就不会,
所以必须手动修改$game_temp.battleback_name以达到立刻改变战斗背景的效果
当然如果并非在战斗中调用,$game_map.battleback_name = "003"一行就足够了
53、更改雾的色调
语句:$game_map.start_fog_tone_change(Tone.new(红色调,绿色调,蓝色调,灰度),时间)
示例:$game_map.start_fog_tone_change(Tone.new(255,0,0,0),20)
效果:在20帧的时间内把雾的色调渐变成红色
54、更改雾的不透明度
语句:$game_map.start_fog_opacity_change(不透明度, 时间)
示例:$game_map.start_fog_opacity_change(50, 10)
效果:在10帧的时间内把雾的不透明度变为50
#=======================================================#
# 扩展功能
#=======================================================#
细心观察的话已经可以发现到,事件脚本可以超出事件原有的限制,或者简化复杂的事件操作
1、变量的计算
要用事件来计算一个数值的话,就需要用变量来代入,而且所需要计算的数值越复杂,包含的变量就越多
比如一号变量的值=二号变量+一个随机数0到30+三号变量,用平时事件的方法就要先让一个变量代表随机数,
然后用一号变量加上,然后再用一号变量加上二号变量,再加上三号变量,操作繁琐而且还浪费了一个变量做随机数
而事件脚本就不同,只需要这么写,
示例:
a = $game_variables[2]
b = $game_variables[3]
$game_variables[1] = a + rand(31) + b
就可以轻易算出一号变量的值,比事件操作方便易懂很多,就和数学计算一样,而且不容易出现操作失误,
还节省了一个用来代入随机数的变量。此外这还可以用来做较复杂的数学运算,
示例:
a = $game_variables[2]
b = $game_variables[3]
c = $game_variables[4]
$game_variables[1] = ((a.abs - Math.sqrt(b))/c).abs.round
这个就是一号变量=二号变量的绝对值-三号变量的平方根,然后用得到的值再除以四号变量,得到的结果的绝对值并且四舍五入。这个使用事件根本不可能完成的 东西,但是用事件脚本却可以做到,当然了,这个是数学运算,所以也不能出现数学的问题,比如说负数不能开根号,0不能做被除数等
注意:若连续的脚本长度超过了一行,就要用\来给该行结尾,然后下一行继续写,这两行的内容就会被当作一行
2、代入原本变量无法代入的东西
有些东西是无法用原本的变量来带入的,比如某物品的价格,某角色学会特技的数量,队员的职业位置(前卫0,中卫1,后卫2),道具的种类数量等,但是在事件脚本中,这些东西就可以被变量代入
以下就是一些只有使用事件脚本才能代入的东西,因为数量过多不可能全都写出来只是举例写几个,其他的请自己研究
$data_items[物品编号].price # 指定编号的物品的价格
$data_items[物品编号].scope # 指定编号的物品的效果范围
$game_actors[角色编号].skills.size # 指定编号的角色的学会特技数量
$data_items.size # 道具的种类数量
$data_skills.size # 特技的种类数量
$data_classes[$game_actors[角色编号].class_id].position # 指定角色的职业位置
$data_skills[特技编号].power # 指定编号的特技的威力
3、扩展的音乐功能
原本的事件中只有停止SE的功能,但是用事件脚本却可以制造出停止BGM,BGS,ME的功能
语句:Audio.bgm_stop
效果:就是停止BGM
语句:
Audio.bgs_stop
Audio.me_stop
效果:就是停止BGS和ME
4、代入角色在队伍中的位置
事件的功能关于角色相关操作的部分,只能代入角色的编号,而不能代入角色在队伍中的位置,
比如队伍里的一号角色,二号角色等,而事件脚本却可以,
示例:$game_party.actors[0].hp
效果:代表了队伍里面的第1个角色的HP值,即领队角色的HP值,这与这个角色在数据库中的编号就没有关系了
示例:$game_party.actors[3].id
效果:代表队伍里面第4号角色的角色编号,可以通过$game_party.actors[0].id知道目前的领队角色是谁
5、独立开关的操作
事件里面的独立开关只能适用于当前的事件,但是如果使用了事件脚本就大大不同
语句:$game_self_switches[[地图编号,事件编号,"独立开关名称"]] = true/false
效果:可以操作不同的地图,不同的事件的独立开关,比如说在地图3的第5号事件也可控制地图6的第8号事件的独立开关
true就是打开,false就是关闭。
示例:$game_self_switches[[3, 5, "A"]] = true
效果:打开第3号地图的第5号事件的独立开关A
注意:可能存在的问题:这个语句只能操作独立开关A,如果换成了其他的就没有反应,并且无法关闭,独立开关无法用这个指令来关闭!不过即便如此但功能仍然算强大,可以避免浪费大量开关
6、神奇的显示文章
默认的显示文章只可以显示文字以及变量等,但是用事件脚本却可以显示更多东西,
比如当前的地图名称,某角色的HP,携带的某道具数量等
示例:
a = "一号角色的HP为" + $game_actors[1].hp.to_s + "\n"
b = "当前地图名为"
c = load_data("Data/MapInfos.rxdata")[$game_map.map_id].name) + "\n"
d = "目前携带了" + $game_party.item_number(1).to_s + "个1号道具!"
$game_temp.message_text = a + b + c + d
注意:"\n"代表换行,.to_s代表把数字换成字符
效果:
一号角色的HP为XXX
当前的地图名为XXXXXX
目前携带了X个1号道具!
7、用for loop同时关闭连续的开关,变化变量,消除图片等
示例:
for i in 2..90
$game_switches[i] = false
end
效果:关闭2到90号的开关,同样可以运用在消除图片等一系列连贯的东西上
示例:
for i in 1..40
$game_screen.pictures[i].erase
end
效果:消除1到40号图片
8、突破限制
在设置移动路线的那个事件指令中,设置角色移动速度的话最高只能设置到6,
但是通过事件脚本(在事件指令-设置移动路线-脚本中),可以获得你想要的任何速度!
语句:@move_speed = 20
你可以获得像这个一样的“光速”,也可以获得和
语句:@move_speed = 0.1
一样的超低速度,速度可随意调整,可以出现小数甚至随机数等。
此外,渐变也一样,默认的事件执行渐变,渐变的时间永远是定死的40帧(因为脚本Scene_Map里这么规定),
但是如果用事件脚本,就可以获得比40帧更长或者更短的时间,因为那个时间是可以自己设定的,
突破限制也同样适用于画面震动和天候设置里面的强度/速度设定
9、立刻执行事件
语句:$game_map.events[事件编号].start
示例:$game_map.events[5].start
效果:立刻执行5号事件
#=======================================================#
# 事件脚本在条件分歧中的灵活运用
#=======================================================#
事件脚本也可用于制作条件分歧
在事件指令中的条件分歧指令里面,在最后一页可以看到脚本这个选项,别看这里给你的空间很小,其实只要你的事件脚本是一行,无论多长都是可以被接受的。
1、同时进行多个判定
如果只是用纯事件来做的话,要同时判定多个东西就必须在条件分歧里面再加条件分歧,
这样看起来令人眼花缭乱,非常的不舒服,但是事件脚本就可以同时制造多个判定
比如说我现在要判定XXX指令,必须要在一号角色HP30以下,二号角色等级大于5,4号道具数量刚好等于5个,3号角色必须在队伍中才执行,这时候就可 以在事件脚本那里写(这里的事件脚本是绝对不可能挤在条件分歧里的那个狭小事件脚本空间里,虽然绝对放得下,但那样会非常不方便看,所以建议先开一个记事 本,在那里写好了然后复制粘贴进去):
$game_actors[1].hp <= 30 and $game_actors[1].hp > 5 and $game_party.item_number(4) == 5 and $game_party.actors.include?($game_actors[3])
这样就是同时满足四个条件的判定,每个不同的判定用and连接,代表必须同时满足。而
$game_actors[1].hp <= 30 or $game_actors[1].hp > 5 or $game_party.item_number(4) == 5 or $game_party.actors.include?($game_actors[3])
就代表只要满足这四个条件中的一个就可以让指令XXX执行,每个不同的判定用or连接,代表只需要满足其中的一个条件。还有
$game_actors[1].hp <= 30 and ($game_actors[1].hp > 5 or $game_party.item_number(4) == 5 or $game_party.actors.include?($game_actors[3]))
就代表说只要满足“一号角色HP30以下”和其他三个条件中的任意一个就可以让指令XXX执行,
在一起的判定or要用括号扩起来,与and区分开来,不然无法正确判定,
附带写一下之前没有写过的但是在条件分歧中出现的判定:
语句:$game_party.actors.include?($game_actors[角色编号])
效果:判断特定角色是否在队伍中
语句:$game_actors[角色编号].name
效果:返回特定角色名称
语句:$game_actors[角色编号].skill_learn?(特技编号)
效果:判断特定角色是否习得某特技
语句:$game_actors[角色编号].state?(状态编号)
效果:判断特定角色的状态
2、对按键的判定
原本条件分歧中对按键的判定都是“按住”,而不是“按下”,
也就是说,当这个按键被按住的这段时间里,就一直满足条件,反复执行内容,
而不是按一下执行一次,如果按住不放而不再次按下就不会执行,
所以这时候又要用到事件脚本
语句:Input.trigger?(Input::按键名称)
效果:这就是判定“按下”一次,按住不放的话就不会再生效
语句:Input.repeat?(Input::按键名称)
效果:这就是判定“按下”并且“按住”,可以利用“蓄力攻击”的思路理解该功能
语句:Input.press?(Input::按键名称)
效果:这就是判定“按住”,原本条件分歧里有的就是这个
关于这里可以使用的按键名称:
A 对应键盘Z键,Shift键
B 对应键盘X键,ESC键,小键盘0键
C 对应键盘C键,空格键,Enter键和小键盘Enter键
X 对应键盘A键
Y 对应键盘S键
Z 对应键盘D键
L 对应键盘Q键
R 对应键盘W键
DOWN 对应键盘下键
LEFT 对应键盘左键
RIGHT 对应键盘右键
UP 对应键盘上键
SHIFT 对应键盘Shift键
CTRL 对应键盘Ctrl键
ALT 对应键盘Alt键
F5 对应键盘F5键
F6 对应键盘F6键
F7 对应键盘F7键
F8 对应键盘F8键
F9 对应键盘F9键
3、判定存档的存在
语句:
for i in 0..3
if FileTest.exist?("Save#{i+1}.rxdata")
@continue_enabled = true
end
end
判断@continue_enabled的真伪即可
4、判定是否可通行
语句:$game_player.passable?(x, y, 朝向)
语句:$game_map.events[事件编号].passable?(x, y, 朝向)
示例:$game_player.passable?(5, 3, 2)
效果:判断角色在当前地图坐标5,3的地方的下方是否可以通行
5、判定是否在移动中
语句:$game_player.moving?
语句:$game_map.events[事件编号].moving?
至于这些有什么作用,就请自由发挥
#======================================================#
# 设置移动路线中的脚本用法
#======================================================#
在"移动路线"的设置里使用脚本可以实现另外44个按钮的全部功能,脚本写法如下:
1.向下移动: move_down
2.向左移动: move_left
3.向右移动: move_right
4.向上移动: move_up
5.左下移动: move_lower_left
6.左上移动: move_upper_left
7.右下移动: move_lower_right
8.右上移动: move_upper_right
9.随机移动: move_random
10.接近主角: move_toward_player
11.远离主角: move_away_from_player
12.前进一步: move_forward
13.后退一步: move_backward
14.跳跃: jump(x,y) x是水平跳跃距离,y是垂直跳跃距离,都是相对值,例如 jump(-5,7)
15.等待: @wait_count=f 这里的f是想等待的帧数,注意实际值会按f的一半计算,所以等待2帧要=4
16.面向下: turn_down
17.面向左: turn_left
18.面向右: turn_right
19.面向上: turn_up
20.右转90度: turn_right_90
21.左转90度: turn_left_90
22.旋转180度: turn_180
23.右或左转90度: turn_right_or_left_90
24.随机变换: turn_random
25.面向主角: turn_toward_player
26.背向主角: turn_away_from_player
27-28.开关操作:
$game_switches[开关id]=true/false
$game_map.need_refresh=true 注:加这一条是因为在地图上操作,需要刷新事件开关
29.更改移动速度: @move_speed=(1-6),1为最慢,6为最快,可更大更小,事件默认值3,角色默认值4
30.更改移动频率: @move_frequency=(1-6),1为最低,6为最高,事件默认值3,角色默认值6
31-32.移动动画开关: @walk_anime=true/false
33-34.停止动画开关: @step_anime=true/false
35-36.面向固定开关: @direction_fix=true/false
37-38.穿透开关: @through=true/false
39-40.总在最前开关: @always_on_top=true/false
41.更改图形:
@tile_id=0
@character_name=新的行走图文件名
@character_hue=新的行走图色相
@direction=新的朝向 取值2 4 6 8(下 左 右 上)
@pattern=新的步伐 取值0 1 2 3(对应行走图从左到右的4格)
42.更改不透明度: @opacity=(0-255)
43.更改合成方式: @blend_type=(0-2) 0为正常 1为加法 2为减法
44.演奏SE: $game_system.se_play(SE文件名,音量,节拍) 音量0-100默认80,节拍50-150默认100
利用脚本的循环可以很方便的简化移动路线设置,比如有一个路线要让NPC上移11格,然后右移7格,再下移4格
用事件来做,移动路线会长达11+7+4=22条,用脚本来写,则可以:
n=11;n.times do move_up; end
n=7;n.times do move_right; end
n=4;n.times do move_down; end
想把三条合也都可以……
不过需要注意的是,由于一句脚本是作为一个整体来执行的,并且判定上有别于移动事件,
所以它不会受到"忽略不能移动的场合"影响,这意味着你必须确认NPC经过的路线畅通无阻才行
移动路线脚本的其他用处:
属性类:
自身座标: self.x self.y self.z
自身移动中: self.moving?
自身跳跃中: self.jumping?
自身通行判定: self.passable?(x,y,方向) 方向为2 4 6 8 定义同前
自身地形标记: self.terrain_tag
动作类:
移动到指定地点: moveto(x,y)
更改角色的移动模式:
@move_type=0 更改移动模式为立定
@move_type=1 更改移动模式为随机
@move_type=2 更改移动模式为接近
@move_type=3 更改移动模式为自定义
另外,当移动模式设为自定义时,在移动路线里输入脚本可以仿真前两种移动模式
move_type_random 随机移动
move_type_toward_player 接近主角的位置
移动路线脚本只能写1行,但没有长度限制,所以在允许的范围内,
可以用分号来写一些较复杂的控制结构比如循环,但没法实现分歧结构
比如:当事件离主角6格时更改移动模式为接近,否则随机
事件的移动类型设为自定义
移动路线:
语句:
move_type_random if (self.x - $game_player.x).abs ** 2 + (self.y - $game_player.y).abs ** 2 < 36
语句:
move_type_toward_player if (self.x - $game_player.x).abs ** 2 + (self.y - $game_player.y).abs ** 2 >= 36
以上。感谢SailCat等原作者。
=end
附件:RMXP_事件脚本参考.txt(66RPG原)
附件:RMXP_事件脚本参考改.txt(同本页面)
附件:【转】[RGSS2]事件脚本参考.txt(66RPG原)
非常感谢!辛苦了!!这对我的帮助真的是太大了!!