类 内容 说明
Game_Battler 战斗者 Game_Actor、Game_Enemy 的父类
Game_Character 人物 Game_Player、Game_Event 的父类

所谓父类,有继承的意思。因为在角色和敌人、主角和事件中各自有共同的性质,所以把这些共同的部分作为一个类。

最后 Game_Xxxx 系列类只剩下一个了。

类 内容 说明
Game_BattleAction 行动 Game_Battler 的内部使用

这个是管理战斗中行动的类,在战斗者内部使用。

这个「脚本入门」是以大致掌握预置脚本全体概貌为目的,所以本章所提及类的具体内容没有各自说明。但是在实际挑战脚本对脚本进行改造时,这些内容定义的是什么将会十分重要。在预置脚本中都有一些注释说明,一开始可能不太明白,但推荐有兴趣的人仔细看看。
【活动块的管理】
游戏对象本身,没有任何在画面中显示自身的方法。所以建立反映游戏对象内容,在画面中显示图片的类就很必要。

活动块在脚本编辑器左侧的组列表中,Game_Xxxx 的部分已经介绍过了。现在让我们来看看 Sprite_Xxxx 名称的组吧。这些组的名称与其定义的类的名称相对应,如下所示。

类 内容 父类
Sprite_Character 角色显示用 RPG::Sprite
Sprite_Battler 战斗显示用 RPG::Sprite
Sprite_Picture 显示图片用 Sprite
Sprite_Timer 显示计时器用 Sprite

这些类,是继承于基础篇中学习过的 Sprite 类,或其高功能版 RPG::Sprite 类,具有在实际中显示各图片活动块的功能。

名活动块类的实例实时监视对应的游戏对象,其状态发生变化的话,会自动的在画面中反映。比如 Sprite_Character 是角色显示用的活动块,会监视 Game_Character 的被继承类的实例。人物在地图上稍微移动一下,这个动作会立即在活动块中反映。实际上这个「反映」的处理是调用 update 名称的方法时进行的。调用该方法在下面的活动块组中也有介绍。

活动块组在活动块组中有下面两个类。

类 内容
Spriteset_Map 地图画面显示用
Spriteset_Battle 战斗画面显示用

这些类,统一管理构成各个画面的几乎全部图片(窗口和光标除外)。当然包括前面介绍的活动块类,地图本身和天气效果等,以及一切能收集到的图片对象,调用 update 名称的方法,就会在游戏环境中更新全部的图片。

调用活动块组的 update 方法,将在本篇后面一章场景类中说明。

这些类中,场所入口和活动块 Z 座标的概念承担了重要的任务。这些关系到显示各图片的优先顺序。请同时参照 Viewport 类的说明。

Spriteset_Map地图画面活动块组的构成如下所示(数字是 Z 座标)。

@viewport3 (5000) - 画面的闪烁
@timer_sprite (500) - 计时器
@viewport2 (200) @picture_sprites (1..50) 图片
@viewport1 (0) @fog (3000) 雾
@weather (1000) 天气
@character_sprites (0..800) 人物
@tilemap (0..800) 地图
@panorama (-1000) 远景
Spriteset_Battle战斗画面活动块组的构成如下所示(数字是 Z 座标)。

@viewport4 (5000) - 画面的闪烁
@timer_sprite (500) - 计时器
@viewport3 (200) @picture_sprites (51..100) 图片
@viewport2 (101) @actor_sprites (1..4) 战斗者(角色)
@viewport1 (0) @weather (1000) 天气
@enemy_sprites (1..320) 战斗者(敌人)
@battleback_sprite (0) 战斗背景
【窗口的管理】
从信息窗口和状态窗口开始,RPG 中必须要使用大量的窗口。现在我们来介绍这些窗口是如何管理的。

基本窗口脚本中以 Window_Xxxx 命名的组有很多吧。根据惯例它们的名称与其定义的类名是相对应的。其中有两个尤其重要,就是最上面的那两个类。

类 内容 父类
Window_Base 基本窗口 Window
Window_Selectable 项目选择窗口 Window_Base

首先,必须要知道在 RGSS 中 Window 类是已预先设定好的。这个类在基础篇中没有提及,负责窗口的边框,背景的描绘以及内容的滚动等这些比较低级的处理,是一个非常底层的类。

Window_Base 类是这个 Window 类的子类,负责在 RPG 的窗口中添加必要的基本功能。这个类最重要的功能,是自动读取为当前窗口设定的皮肤图片文件。而且,各种文字颜色也是由这个类定义的。

Window_Selectable 类是 Window_Base 的子类,添加了检测键盘按钮的输入及移动光标的处理。比如说物品的选择,游戏中物品选择窗口会频繁的使用。这个类定义了这些窗口的一些共同功能。实际的光标移动处理,是调用 update 名称的方法时进行的。

调用窗口的 update 方法,将在本篇后面一章场景类中说明。

窗口的应用现在我们来一起介绍窗口系列剩下的其它类。这些类,全都是从 Window_Base 类或 Window_Selectable 类继承而来的。

类 内容 父类
Window_Command 指令窗口(泛用) Window_Selectable
Window_Help 帮助窗口 Window_Base
Window_Gold 显示金钱窗口 Window_Base
Window_PlayTime 菜单画面用 游戏时间窗口 Window_Base
Window_Steps 菜单画面用 步数窗口 Window_Base
Window_MenuStatus 菜单画面用 状态窗口 Window_Selectable
Window_Item 物品选择窗口 Window_Selectable
Window_Skill 特技选择窗口 Window_Selectable
Window_SkillStatus 特技画面用 状态窗口 Window_Base
Window_Target 物品、特技画面用 对象选择窗口 Window_Selectable
Window_EquipLeft 装备画面用 左侧窗口 Window_Base
Window_EquipRight 装备画面用 右侧窗口 Window_Selectable
Window_EquipItem 装备画面用 物品窗口 Window_Selectable
Window_Status 状态画面用 状态窗口 Window_Base
Window_SaveFile 存档、读档画面用 文件窗口 Window_Base
Window_ShopCommand 商店画面用 商品选择窗口 Window_Selectable
Window_ShopBuy 商店画面用 购买窗口 Window_Selectable
Window_ShopSell 商店画面用 出售窗口 Window_Selectable
Window_ShopNumber 商店画面用 数量输入窗口 Window_Base
Window_ShopStatus 商店画面用 状态窗口 Window_Base
Window_NameEdit 名称输入画面用 名称窗口 Window_Base
Window_NameInput 名称输入画面用 文字选择窗口 Window_Base
Window_InputNumber 数值输入窗口 Window_Base
Window_Message 信息窗口 Window_Selectable
Window_PartyCommand 战斗画面用 同伴指令窗口 Window_Selectable
Window_BattleStatus 战斗画面用 状态窗口 Window_Base
Window_BattleResult 战斗画面用 结果显示窗口 Window_Base
Window_DebugLeft 调试画面用 左侧窗口 Window_Selectable
Window_DebugRight 调试画面用 右侧窗口 Window_Selectable
箭头光标所谓箭头光标,是在战斗画面中选择角色和敌人作为行动对象时使用的光标。它的性质更接近于窗口,为了方便所以就放在这里介绍。

类 内容 父类
Arrow_Base 箭头光标 Sprite
Arrow_Enemy 敌人选择用 箭头光标 Arrow_Base
Arrow_Actor 角色选择用 箭头光标 Arrow_Base

Arrow_Base 类,包含光标图像的忽明忽暗等基本处理。Arrow_Enemy、Arrow_Actor 类分别参照 $game_troop 和 $game_party 等游戏对象,根据方向键的左右输入执行选择战斗者的处理。和窗口一样,忽明忽暗和移动光标的处理是调用 update 名称的方法时进行的。
【编译器】
现在我们来介绍 RPGXP 的事件指令在脚本内是如何操作的。

Interpreter 类事件指令中有「显示文章」和「场所移动」等变化丰富的命令,把这些指令组合起来就能操控游戏的进行。但是,事件指令列表,在脚本内并不是 RPG::EventCommand 类实例简单的排列。要解释这个事件指令的数据,执行该任务的就是编译器。

在脚本左侧的目录中有名称为 Interpreter 1~7 的组,这些组用来分割定义 Interpreter 这个巨大的类。该类在预置脚本定义的类中是个相当大规模的类。

这个类的实例属于以下的这 3 个类。

Game_System
Game_Event
Game_CommonEvent
这样可以认为是在游戏对象的内部使用,编译器广义上也可以说成是游戏对象的一种。

个体事件和公共事件有必要保持编译器实现并列处理。通常的(非并列)事件执行常规,也就是主要的编译器是包含 Game_System 类中。

事件代码各事件指令中都分配有如下表那样代码。Interpreter 类根据这些代码来辨别事件指令,并调用各自进行处理的方法。

101: 显示文章
102: 显示选择项
103: 数值输入的处理
104: 更改文章选项
105: 按钮输入的处理
106: 等待
108: 注释
111: 条件分歧
112: 循环
113: 中断循环
115: 中断事件处理
116: 暂时消除事件
117: 公共事件
118: 标签
119: 标签跳转
121: 开关操作
122: 变量操作
123: 独立开关操作
124: 计时器操作
125: 增减金钱
126: 增减物品
127: 增减武器
128: 增减防具
129: 替换队员
131: 更改窗口外观
132: 更改战斗 BGM
133: 更改战斗结束 ME
134: 更改禁止存档
135: 更改禁止菜单
136: 更改禁止遇敌
 201: 场所移动
202: 设置事件位置
203: 画面卷动
204: 更改地图设置
205: 更改雾的色调
206: 更改雾的不透明度
207: 显示动画
208: 更改透明状态
209: 设置移动路线
210: 等待移动结束
221: 准备渐变
222: 执行渐变
223: 更改画面色调
224: 画面闪烁
225: 画面震动
231: 显示图片
232: 移动图片
233: 旋转图片
234: 更改图片色调
235: 图片消失
236: 天气设置
241: 演奏 BGM
242: 淡出 BGM
245: 演奏 BGS
246: 淡出 BGS
247: 记忆 BGM / BGS
248: 还原 BGM / BGS
249: 演奏 ME
250: 演奏 SE
251: 停止 SE
 301: 战斗处理
302: 商店处理
303: 名称输入处理
311: 增减 HP
312: 增减 SP
313: 更改状态
314: 完全回复
315: 增减 EXP
316: 增减等级
317: 增减能力值
318: 增减特技
319: 变更装备
320: 更改角色姓名
321: 更改角色职业
322: 更改角色图形
331: 增减敌人 HP
332: 增减敌人 SP
333: 更改敌人状态
334: 敌人出现
335: 敌人变身
336: 敌人完全回复
337: 显示动画
338: 伤害处理
339: 强制行动
340: 战斗中断
351: 呼叫菜单画面
352: 呼叫存档画面
353: 游戏结束
354: 返回标题画面
355: 脚本
 

事件代码就是上述这些,但也不是全部,比如「显示文章」指令下面的第二行分配的是 401 代码,这些存在特殊的情况。但是,事件指令的处理本身因为在预置的 Interpreter 类中完成,所以没必要在意这样的内部代码。只要事先记住这些就 OK 了。
【场景类】
负责地图画面、菜单画面等各种画面处理的就是场景类。

场景类的种类各场景类对应的画面如下所示。除 Scene_Battle 类分割定义外,其它的类名和组名都是一一对应的。另外 Scene_File 类作为 Scene_Save 和 Scene_Load 的父类而定义,没有包含在这个表中。

类 内容
Scene_Title 标题画面
Scene_Map 地图画面
Scene_Menu 菜单画面
Scene_Item 物品画面
Scene_Skill 特技画面
Scene_Equip 装备画面
Scene_Status 状态画面
Scene_Save 存档画面
Scene_Load 读档画面
Scene_End 游戏退出画面
Scene_Battle 战斗画面
Scene_Shop 商店画面
Scene_Name 名称输入画面
Scene_Gameover 游戏结束画面
Scene_Debug 调试画面
场景类的结构场景类的实例是保存在 $scene 名称的全局变量中。这个变量只要值不是 nil 就能调用 main 名称的方法,是继续游戏运行的结构。典型的场景类的构架如下所示。

class Scene_Xxxx
  def main
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
  end
  def update
  end
end

Graphics.freeze 和 Graphics.transition,可以考虑成与各个事件指令的「准备渐变」和「执行渐变」相同的意思。这些方法的详细内容请参照 Graphics 模块的说明。主循环是以这些方法包围的,在画面切换时使用渐变效果。

if $scene != self 是「如果全局变量 $scene 指定的对象不是自己的话」的意思,即「切换到其它画面的情况」(self 是表示自身对象的伪变量)。另外,Input.update 是更新游戏手柄和键盘输入信息的方法。输入关联的处理请参照 Input 模块的说明。

还有,基础篇中曾介绍过的下面这个形式是 RGSS 游戏运行的基本结构。场景类的 main 方法那样复杂的处理,都是在这个形式上发展而来的。

loop do
  Graphics.update
end

Main 组终于到最后的组了。到现在为止上面的组全都是关于类的定义,实际上,可以认为真正脚本的运行是从这里开始的。Main 组除去注释只剩下下面的这 12 行。

begin
  Font.default_name = (["黑体"])
  Graphics.freeze
  $scene = Scene_Title.new
  while $scene != nil
    $scene.main
  end
  Graphics.transition(20)
rescue Errno::ENOENT
  filename = $!.message.sub("No such file or directory - ", "")
  print("找不到文件 #{filename}。")
end

begin ~ rescue ~ end 是异常处理的句法。这里,是脚本的运行中如果发生「找不到文件」的异常情况时指定转移执行 rescue 以下的处理。即显示「找不到文件 XXX」的错误信息后结束程序。异常处理在预置脚本中也可以不使用,所以没有记住其使用方法也不要紧。

Graphics.freeze 和 Graphics.transition 在先前就已介绍过了。其中最先是进行「准备渐变」,准备从乌黑的状态逐渐显示到标题画面。最后的 Graphics.transition 是相反的过程又渐变到乌黑状态结束。参数指定为 20,为一般延迟的渐变。其中第二行是设置系统默认字体。

还剩下 4 行。先是生成负责标题画面处理的 Scene_Title 类的实例,设定全局变量 $scene。然后和前面讲过的那样 $scene 变量只要值不是 nil 就调用 main 名称的方法。

最后非常感谢大家。「脚本入门」到这里就结束了。

迄今学习到的知识,参照 RGSS 参考,应该就能明白的解读预置脚本了。没有必要绝对理解 RGSS 的全部。有兴趣的话可以到脚本中看看,是不是很自然的产生了要改造脚本的想法。

可能性是无限的。使用 RGSS 做什么,一切随您。

arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()