如何优雅的研究 RGSS3 (二) 为游戏结束画面添加简单的选项

如何优雅研究 RGSS3 (一) 场景中窗口的工作原理 RGSS3中,场景是应该是游戏的基本组成单位。 阅读详情

上一期研究了场景中显示窗口的基本原理,本期就动手亲自写一写简单的窗口。

向 Gameover 场景里添加自制的窗口是个不错的选择, 因为 Scene_Gameover 是少数不含窗口的场景之一。

在 RGSS3 的默认脚本中,游戏因为某种原因(战斗失败、HP变为0、强制游戏结束)结束后,会直接跳到 Gameover 场景。

而在 Gameover 场景中按下空格键就会回到游戏标题画面。

这不科学嘛,虽然在标题画面中也可以读取游戏进度,但是显然在游戏结束画面直接读取进度更为方便。

所以我们现在就为游戏结束画面添加一个窗口,给出三个选项:回到标题画面、载入进度、关闭游戏。

虽然在上一期中已经了解了窗口类的工作原理,但是具体细节仍然不太清晰,突然要我们自己写一个还是不知道该从何入手。

#encoding:utf-8
#==============================================================================
# ■ Window_OverLoad
#------------------------------------------------------------------------------
#  游戏结束后可以读档的窗口。
#==============================================================================

class Window_OverLoad < Window_Command
先把注释写好肯定错不了,我们要写的结束后读档的窗口显然是 Window_Command 的子类。

我们的窗口类有三个选项而且还能读档,这和标题画面中选择“开始游戏/继续游戏”的窗口的功能非常接近。

所以直接把 Window_TitleCommand 的代码复制一份粘贴到 Window_OverLoad 好了。不会有问题的!

但是在标题画面的窗口中,第一个选项是开始新游戏,在 Window_OverLoad 中应该改成回到标题画面。

于是我们把生成指令列表的方法 make_command_list 中的第一句话 add_command(Vocab::new_game, :new_game) 改为 add_command(Vocab::to_title, :to_title) 。

new_game 与 to_title 都是在 Vocab 模块中定义的一些表示游戏用语的字符串常量。

  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0)
    update_placement
    select_symbol(:continue) if continue_enabled
    self.openness = 0
    open
  end
  #--------------------------------------------------------------------------
  # ● 获取窗口的宽度
  #--------------------------------------------------------------------------
  def window_width
    return 160
  end
  #--------------------------------------------------------------------------
  # ● 更新窗口的位置
  #--------------------------------------------------------------------------
  def update_placement
    self.x = (Graphics.width - width) / 2
    self.y = (Graphics.height * 1.6 - height) / 2
  end
  #--------------------------------------------------------------------------
  # ● 生成指令列表
  #--------------------------------------------------------------------------
  def make_command_list
    add_command(Vocab::to_title, :to_title)
    add_command(Vocab::continue, :continue, continue_enabled)
    add_command(Vocab::shutdown, :shutdown)
  end
  #--------------------------------------------------------------------------
  # ● 获取“继续游戏”选项是否有效
  #--------------------------------------------------------------------------
  def continue_enabled
    DataManager.save_file_exists?
  end
end
在窗口初始化时先计算了窗口所在的位置,将窗口设定在游戏画面中央偏下的位置。

接下来判断了一下是否有存档,如果没有存档记录的话就禁用“继续游戏”选项。

self.openness = 0 将窗口设置为了没打开状态,然后调用 open 展示了一个窗口打开动画。


接下来向 Scene_Gameover 类中添加 create_command_window 方法的定义,并在 start 方法的最后调用它。

  #--------------------------------------------------------------------------
  # ● 生成指令窗口
  #--------------------------------------------------------------------------
  def create_command_window
    @command_window = Window_OverLoad.new
    @command_window.set_handler(:to_title, method(:command_to_title))
    @command_window.set_handler(:continue, method(:command_continue))
    @command_window.set_handler(:shutdown, method(:command_shutdown))
  end
在里将游戏结束场景中的三个方法 command_to_title、command_continue、command_shutdown 与 Window_OverLoad 的实例 @command_window 关联在了一起。

虽然现在我们还没有添加这三个方法的具体内容。

  def command_to_title
  end
  
  def command_continue
  end
  
  def command_shutdown
  end

现在进入游戏的结束画面,发现多了一个跟游戏标题画面里的窗口很像的窗口,里面有三个选项。


现在不管在什么选项上按下确定键都只会回到标题画面。

为什么会这样呢?

  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  def update
    super
    goto_title if Input.trigger?(:C)
  end
发现 Scene_Gameover 的 update 方法中有这样一句话 goto_title if Input.trigger?(:C) 。

goto_title 也是 Scene_Gameover 中的方法。调用它切换到标题画面。

这样一句话就是说在更新场景时,如果侦测到按下了确定键,就调用 goto_title 回到标题画面。

  #--------------------------------------------------------------------------
  # ● 切换到标题画面
  #--------------------------------------------------------------------------
  def goto_title
    fadeout_all
    SceneManager.goto(Scene_Title)
  end
SceneManager 是场景切换的管理器,调用其 goto 方法可以直接切换某个场景(无过渡)。

现在我们将其删去。然后向 command_to_title 方法中添加 goto_title 的调用。

类似的,向 command_continue 方法中添加一句 SceneManager.goto(Scene_Load) ,向 command_shutdown 方法中添加一句 SceneManager.exit。

  def command_to_title
    goto_title
  end
  
  def command_continue
    SceneManager.goto(Scene_Load)
  end
  
  def command_shutdown
    SceneManager.exit
  end
这下三个选项的基本功能就做好了,不过还是有一些瑕疵在里面。

当我们选择继续游戏选项后,进入载入游戏画面,然后我们按下取消键,游戏就自己关掉了- -

这是因为我们是用 goto 方法进入的新场景,SceneManager 切换场景的方法有两个:

  #--------------------------------------------------------------------------
  # ● 直接切换某个场景(无过渡)
  #--------------------------------------------------------------------------
  def self.goto(scene_class)
    @scene = scene_class.new
  end
  #--------------------------------------------------------------------------
  # ● 切换
  #--------------------------------------------------------------------------
  def self.call(scene_class)
    @stack.push(@scene)
    @scene = scene_class.new
  end
goto 方法直接切换场景,而 call 方法将现在的场景压入栈中,然后再切换场景,这是为回到上一个场景的 return 方法做准备。

  #--------------------------------------------------------------------------
  # ● 返回到上一个场景
  #--------------------------------------------------------------------------
  def self.return
    @scene = @stack.pop
  end
当在载入游戏的场景中按下取消键时,Scene_Load 的父类 Scene_File 更新画面时的 update_savefile_selection 方法检测到了取消键,于是执行 on_savefile_cancel 方法:

  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  def update
    super
    @savefile_windows.each {|window| window.update }
    update_savefile_selection
  end

  #--------------------------------------------------------------------------
  # ● 更新存档文件选择
  #--------------------------------------------------------------------------
  def update_savefile_selection
    return on_savefile_ok     if Input.trigger?(:C)
    return on_savefile_cancel if Input.trigger?(:B)
    update_cursor
  end

  #--------------------------------------------------------------------------
  # ● 存档文件“取消”
  #--------------------------------------------------------------------------
  def on_savefile_cancel
    Sound.play_cancel
    return_scene
  end

return_scene 是游戏中所有 Scene 类(场景类)的父类 Scene_Base 中的方法,它调用了 SceneManager 的 return 方法。

  #--------------------------------------------------------------------------
  # ● 返回前一个场景
  #--------------------------------------------------------------------------
  def return_scene
    SceneManager.return
  end
现在我们知道问题出在哪了,将 command_continue 中的 SceneManager.goto(Scene_Load) 改为 SceneManager.call(Scene_Load)。

这样在载入游戏场景中按下取消键就会返回游戏结束场景。

嗯,这样就好多了,可是还是有些别扭,选中选项时总是感觉有些僵硬。

与标题画面做了对比后发现,我们的窗口少了关闭时的动画,难怪感觉有些不对。

  #--------------------------------------------------------------------------
  # ● 关闭指令窗口
  #--------------------------------------------------------------------------
  def close_command_window
    @command_window.close
    update until @command_window.close?
  end
没错,正是 Scene_Title 中的 close_command_window 方法使标题画面中的窗口有了关闭动画。

在 Scene_Title 中的每个选项方法,在执行其功能之前,都会先调用 close_command_window 显示一个关闭窗口的动画。

我们也将 close_command_window 方法的定义和调用添加到 Scene_Gameover 中。

  def command_to_title
    close_command_window
    goto_title
  end
  
  def command_continue
    close_command_window
    SceneManager.call(Scene_Load)
  end
  
  def command_shutdown
    close_command_window
    SceneManager.exit
  end
这样我们的窗口也变得酷炫了起来。

虽然很想说这样就完美了,不过呢,还是漏了一点东西。

在 Scene_Base 中有一个 fadeout_all 方法,淡出各种音效以及图像。

  #--------------------------------------------------------------------------
  # ● 淡出各种音效以及图像
  #--------------------------------------------------------------------------
  def fadeout_all(time = 1000)
    RPG::BGM.fade(time)
    RPG::BGS.fade(time)
    RPG::ME.fade(time)
    Graphics.fadeout(time * Graphics.frame_rate / 1000)
    RPG::BGM.stop
    RPG::BGS.stop
    RPG::ME.stop
  end
调用这个方法可以让当前的所有声音与画面在1秒内渐渐消失。

在离开 Scene_Gameover 场景的时候调用一下这个方法可以让场景的切换不那么突兀。

  def command_to_title
    close_command_window
    fadeout_all
    goto_title
  end
  
  def command_continue
    close_command_window
    fadeout_all
    SceneManager.call(Scene_Load)
  end
  
  def command_shutdown
    close_command_window
    fadeout_all
    SceneManager.exit
  end

这样我们的窗口终于完美啦,赶紧 Gameover 体验一下吧。















如何优雅研究 RGSS3 (六) 技能与物品画面剖析 物品与技能画面剖析 物品画面和技能画面有共同的父类 Scene_ItemBase,而 Scene_ItemBase 继承自 Scene_MenuBase。 Scene_ItemBase 在开始时用 create_actor_window 生成了显示角色的窗口备用。 Scene_ItemBase 中定义了若干方法作为处理画面的工具。 其中 show_sub_window、hi 阅读详情

相关推荐

RGSS3:miaowm5提供的免费RPG Maker VX Ace(RGSS3)脚本

欢迎 放在这里的是由我(喵呜喵5)自己写的RGSS3脚本。 Github并不是更新的主力,目前的重心还是放在我在P1的 。 这些脚本全部免费使用,但是使用脚本前请先阅读 。 Created By Mwm5 All Rights Reserved

如何优雅研究 RGSS3 (三) 调整窗口的细节

在上一期我们研究了带选项的窗口,本期就来研究一下窗口类的具体细节。

Azarath Metrion Zinthos 5179

rgss3-scripts

rgss3 脚本 这个存储库包含我的 RPGMaker VX Ace 脚本。 对于学分,将我称为“regendo”或“bStefan”。 ============== 使用条款 这些使用条款适用于在此存储库中找到的所有脚本的所有版本,除非在最新版本的脚本中另有说明。 过时版本的脚本中提供的使用条款不适用。 相反,最新版本中提供的使用条款适用于同一脚本的所有先前版本。 如果您在您的项目中使用这些脚本中的任何一个,您必须感谢作者。 (i) 如果脚本中提到了其他人(例如,请求脚本、帮助创建脚本或提供有用建议的人),您可以额外感谢这些人。 这是可选的。 您只能在合法获得的 RMVXAce 版本中使用这些脚本。 您不得在商业项目中使用这些脚本,除非作者明确授权您这样做。 (i) 必须为使用的每个脚本授予此权限。 (ii) 必须在项目的任何版本发布之前授予此许可,包括未完成的、alpha

RGSS3 与旧版的比较】

【原帖】 RGSS3 是内置于 RPG Maker VX Ace 的脚本系统,与 RMVX 中的 RGSS2 比,整体结构不同。总体来说: RGSS1的编辑器中脚本页方法名等命名很随便,结构体现的也并不明显 RGSS2将整个脚本进行了梳理,分成了几个大的结构 RGSS3RGSS2的基...

chigang9712的博客 702

RGSS3 - 独立变量

可以在事件中直接使用对应的变量编号达成独立变量的效果。 由于修改了默认的存档内容,与现有游戏存档不兼容。 与大部分同样修改了存档内容的脚本同时使用可能会产生意料之外的情况。 如需使用或转载时请不要删除版权声明信息,并注意标明作者。 #============================================================================== # ■ 独立变量 4.1 By:六零道长 #--------------------------------------

qq_34051808的博客 601

如何优雅研究 RGSS3 (四) 使窗口从画面边缘弹出

在很多游戏中,窗口可以从游戏画面的边缘弹出。 而在 RGSS3 的默认脚本中时没有这种功能的,当在地图上按下取消键时,游戏菜单会突然出现。 现在我们可以为主菜单添加动画效果,使其在屏幕边缘弹出。 我们知道游戏中的画面并不是真正的在动,而是在每一帧都绘制一幅新的画面。 每一帧都对画面做一些微小的改变,在玩家的眼里就会产生画面在运动的错觉。 复杂的运动效果涉及到复杂的公式,这

Azarath Metrion Zinthos 1697

如何优雅研究 RGSS3 (七) 添加LOGO画面

为游戏添加 LOGO 画面。 首先要设计 LOGO 场景类,我们知道场景类都是 Scene_Base 的子类。 我们来回顾一下场景的工作原理。 首先执行开始处理,接着是开始后处理,然后是不停的更新画面,最后结束前处理,然后结束处理。 下面来逐个分析这些方法。 当进入 LOGO 画面时,显然不需要也不可能回到上一个画面,因此在开始处理的方法中,我们要清空场景的切换记录。 接下来要

Azarath Metrion Zinthos 1496

如何优雅研究 RGSS3 番外() 显示文字信息的窗口中的纤程

Ruby 中的 Fiber 通常称为纤程,是一种非抢占式的多线程模型。 纤程不能在外部被终止,只能等待其主动让出执行权。 RGSS3 在事件解释器 Game_Interpreter 与显示文字信息的窗口 Window_Message 中都用到了纤程。 以 Window_Message 为例。 #------------------------------------------

Azarath Metrion Zinthos 1851

如何优雅研究 RGSS3 番外(一) ruby 实现的后缀自动机

*我真的不会 ruby 呀* #encoding:utf-8 #============================================================================== # ■ Suffix_Automaton #----------------------------------------------------------

Azarath Metrion Zinthos 1515

怎样优雅研究 RGSS3 (四) 使窗体从画面边缘弹出

在非常多游戏中,窗体能够从游戏画面的边缘弹出。 而在 RGSS3 的默认脚本中时没有这样的功能的,当在地图上按下取消键时。游戏菜单会突然出现。 如今我们能够为主菜单加入动画效果,使其在屏幕边缘弹出。 我们知道游戏中的画面并非真正的在动。而是在每一帧都绘制一幅新的画面。 每一帧都对画面做一些微小的改变。在玩家的眼里就会产生画面在运动的错觉。 复杂的运动效果涉及到复杂...

weixin_34256074的博客 156

rgss3a解包器

最新的rgss3a解包器,只希望各位用于rgss3a解密后的CG收藏·误走向歧途

一个简单的rpg游戏代码

一个MFC rpg游戏代码!非常的简单!一对一的对战!一人攻击一下的那种!

如何优雅研究 RGSS3 (五) 输入数字的画面

游戏中的名字输入画面是一个非常没有中国特色的场景。 我们知道英文不过26个字母,日语也只有几百个假名,但是汉字的数量实在是太多了,导致名字输入画面在汉化成中文版时只能用部分汉字来填充假名。 输入名字的功能并没有什么重要价值,但是这个功能实现的方法却值得我们研究。 游戏中有一个默认的输入数字的窗口,但是它非常不好用。 今天就来参照名字输入画面编写一个数字输入画面。用于玩家向游戏中输入数字。

Azarath Metrion Zinthos 2177

如何优雅研究 RGSS3 (七) 加入LOGO屏幕

对于游戏 LOGO 屏幕。 首先设计 LOGO Scene类。我们知道,现场类 Scene_Base 子类。 让我们回顾一下现场的作品。 首先运行开始处理。其次是开始治疗。然后停止更新屏幕,最后,治疗结束前,理。 以下来逐个分析这些方法。 当进入 LOGO 画面时,显然不须要也不可能回到上一个画面,因此在開始处理的方法中,我们要清空场景的切换记录。 接下来要创建出须要显...

weixin_33766805的博客 284

MKXP:让RPG Maker游戏在Linux上重获新生的开源引擎

想象一下,你花费数百小时精心制作的RPG Maker游戏,只能在Windows系统上运行,而你的朋友使用的是Linux或macOS——这听起来像是一个技术悲剧,不是吗?但今天我要介绍的MKXP项目,正是为解决这个问题而生。 MKXP是一个完全开源的Ruby游戏脚本系统(RGSS)实现,专门为那些热爱RPG Maker系列(XP、VX、VX Ace)的开发者们提供了一个跨平台解决方案。它让你无需修

gitblog_01168的博客 1037

怎样优雅研究 RGSS3 番外(一) ruby 实现的后缀自己主动机

*我真的不会 ruby 呀* #encoding:utf-8 #============================================================================== # ■ Suffix_Automaton #------------------------------------------------------...

weixin_30287169的博客 157
上一篇: 如何优雅的ML(五) 支持向量机
下一篇: 如何优雅的研究 RGSS3 (三) 调整窗口的细节
cyendra
博客等级 码龄14年 191粉丝 462原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值