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

为游戏添加 LOGO 画面。

首先要设计 LOGO 场景类,我们知道场景类都是 Scene_Base 的子类。

我们来回顾一下场景的工作原理。

首先执行开始处理,接着是开始后处理,然后是不停的更新画面,最后结束前处理,然后结束处理。

下面来逐个分析这些方法。

当进入 LOGO 画面时,显然不需要也不可能回到上一个画面,因此在开始处理的方法中,我们要清空场景的切换记录。

接下来要创建出需要显示的 LOGO 图片,但是不能让它立即显示,而是要使其淡入画面,因此要冻结住图像的显示。

最后播放 LOGO 画面的音效。

  #--------------------------------------------------------------------------
  # ● 开始处理
  #--------------------------------------------------------------------------
  def start
    super
    SceneManager.clear
    Graphics.freeze
    create_logo
    play_logo_music
  end

在画面开始后,我们要准备图像的渐变、接受按键,并初始化计数器。

  #--------------------------------------------------------------------------
  # ● 开始后处理
  #--------------------------------------------------------------------------
  def post_start
    perform_transition
    Input.update
    @count = CONF_LOGO::DISP_FLAME_LOGO
  end

在更新画面时,除了调用的更新画面方法外,还要判断LOGO画面是否结束,结束则进入标题画面。

  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  alias :_orig_update :update
  def update
    _orig_update
    SceneManager.goto(Scene_Title) if disp_logo?
  end

而只有按下跳过键或达到一定时间 LOGO 画面才会结束。而这个一定的时间我们将它设置为一个常量,每次更新画面时将计数器减一,当计数器为零时则结束 LOGO 画面。

  #--------------------------------------------------------------------------
  # ● 判断LOGO画面是否结束
  #--------------------------------------------------------------------------
  def disp_logo?
    if Input.trigger?(:C)
      true if CONF_LOGO::SKIP_LOGO
    else
      @count -= 1
      true if @count <= 0
    end
  end

在结束 LOGO 画面前不要忘了将图片与音乐淡出。

  #--------------------------------------------------------------------------
  # ● 结束前处理
  #--------------------------------------------------------------------------
  def pre_terminate
    fadeout_all(transition_speed)
  end

淡出方法也很简单。

  #--------------------------------------------------------------------------
  # ● 淡出声音和图形
  #--------------------------------------------------------------------------
  def fadeout_all(time)
    RPG::ME.fade(time) if @use_me
    Graphics.fadeout(time)
    RPG::SE.stop if @use_se
    RPG::ME.stop if @use_me
  end<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>

之后在结束处理中将图片精灵消除。

  #--------------------------------------------------------------------------
  # ● 结束处理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_logo
  end

整个场景中其实只有一个精灵,也就是 LOGO 图像精灵。

它在开始处理中创建。

  #--------------------------------------------------------------------------
  # ● 生成LOGO
  #--------------------------------------------------------------------------
  def create_logo
    @sprite = Sprite.new
    @sprite.bitmap = Cache.system(CONF_LOGO::FILE_LOGO)
    center_sprite(@sprite)
  end

从缓存冲取出图像创建出精灵,然后将精灵放置在屏幕中央。

  #--------------------------------------------------------------------------
  # ● 精灵移动到屏幕中央
  #--------------------------------------------------------------------------
  def center_sprite(sprite)
    sprite.ox = sprite.bitmap.width / 2
    sprite.oy = sprite.bitmap.height / 2
    sprite.x = Graphics.width / 2
    sprite.y = Graphics.height / 2
  end

该精灵在结束处理中被释放。

  #--------------------------------------------------------------------------
  # ● 释放LOGO
  #--------------------------------------------------------------------------
  def dispose_logo
    @sprite.bitmap.dispose
    @sprite.dispose
  end

在 Scene_Base 中有一个执行渐变 perform_transition 方法,它调用 transition_speed 获取渐变速度。

我们将其重载为自己的版本。

  #--------------------------------------------------------------------------
  # ● 获取渐变速度
  #--------------------------------------------------------------------------
  def transition_speed
    if Input.trigger?(:C)
      return 0
    else
      return CONF_LOGO::FADE_SPEED_LOGO
    end
  end

LOGO 画面中的音效在开始处理时调用 play_logo_music 播放。

  #--------------------------------------------------------------------------
  # ● 播放LOGO显示时的音效
  #--------------------------------------------------------------------------
  def play_logo_music
    @use_se = true
    @use_me = false

    logo_music = RPG::SE.new(CONF_LOGO::MU_LOGO)
    logo_music.play rescue @use_se = false

    unless @use_se
      @use_me = true
      logo_music = RPG::ME.new(CONF_LOGO::MU_LOGO)
      logo_music.play rescue @use_me = false
    end

  end

这样我们的 LOGO 画面类就设计好了,其中涉及到了许多常量,我们用一个专门的模块来定义它们。

#==============================================================================
# ■ CONF_LOGO
#------------------------------------------------------------------------------
#  设定常量
#==============================================================================

module CONF_LOGO

  # LOGO功能开关
  USE_LOGO = true

  # 回到标题画面时是否显示LOGO画面
  RESET_LOGO = false

  # TEST时是否显示LOGO画面
  TEST_LOGO = true

  # 是否可以跳过LOGO画面
  SKIP_LOGO = true

  # LOGO图像文件名
  # (Graphics/System/设定的LOGO画面文件名)
  FILE_LOGO = "logo"

  # LOGO画面中的SE
  # (Audio/SE/设定的SE文件名 Audio/ME/设定的ME文件名)
  # ※当值为空时不播放
  MU_LOGO = ""

  # 淡入淡出渐变率(帧数)
  FADE_SPEED_LOGO = 10

  # LOGO显示的时间的长度(帧数)
  DISP_FLAME_LOGO = 30

end

重写 SceneManager 中的 first_scene_class,使得最初的场景中显示 LOGO 画面。

#==============================================================================
# ■ SceneManager
#------------------------------------------------------------------------------
#  场景切换的管理器。RGSS3 内置了新功能,在使用 call 方法切换新场景时,可以
#   用 return 方法返回上一个场景。
#==============================================================================

module SceneManager
  @reset_flg = true
  #--------------------------------------------------------------------------
  # ● 获取最初场景的所属类
  #--------------------------------------------------------------------------
  def self.first_scene_class
    if CONF_LOGO::USE_LOGO and @reset_flg
      @reset_flg = false
      # 如果显示LOGO
      if CONF_LOGO::TEST_LOGO
        # 如果在测试时显示LOGO
        $BTEST ? Scene_Battle : Scene_Logo
      else
        # 如果不在测试时显示LOGO
        $BTEST ? Scene_Battle : ( $TEST ? Scene_Title : Scene_Logo )
      end
    else
      # 如果不显示LOGO
      $BTEST ? Scene_Battle : Scene_Title
    end
  end
end

完整的脚本插件代码如下

#encoding:utf-8
#==============================================================================
# ■ CONF_LOGO
#------------------------------------------------------------------------------
#  设定常量
#==============================================================================

module CONF_LOGO

  # LOGO功能开关
  USE_LOGO = true

  # 回到标题画面时是否显示LOGO画面
  RESET_LOGO = false

  # TEST时是否显示LOGO画面
  TEST_LOGO = true

  # 是否可以跳过LOGO画面
  SKIP_LOGO = true

  # LOGO图像文件名
  # (Graphics/System/设定的LOGO画面文件名)
  FILE_LOGO = "logo"

  # LOGO画面中的SE
  # (Audio/SE/设定的SE文件名 Audio/ME/设定的ME文件名)
  # ※当值为空时不播放
  MU_LOGO = ""

  # 淡入淡出渐变率(帧数)
  FADE_SPEED_LOGO = 10

  # LOGO显示的时间的长度(帧数)
  DISP_FLAME_LOGO = 30

end

#==============================================================================
# ■ Scene_Logo
#------------------------------------------------------------------------------
#  LOGO画面。
#==============================================================================

class Scene_Logo < Scene_Base
  #--------------------------------------------------------------------------
  # ● 开始处理
  #--------------------------------------------------------------------------
  def start
    super
    SceneManager.clear
    Graphics.freeze
    create_logo
    play_logo_music
  end
  #--------------------------------------------------------------------------
  # ● 开始后处理
  #--------------------------------------------------------------------------
  def post_start
    perform_transition
    Input.update
    @count = CONF_LOGO::DISP_FLAME_LOGO
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  alias :_orig_update :update
  def update
    _orig_update
    SceneManager.goto(Scene_Title) if disp_logo?
  end
  #--------------------------------------------------------------------------
  # ● 判断LOGO画面是否结束
  #--------------------------------------------------------------------------
  def disp_logo?
    if Input.trigger?(:C)
      true if CONF_LOGO::SKIP_LOGO
    else
      @count -= 1
      true if @count <= 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 结束前处理
  #--------------------------------------------------------------------------
  def pre_terminate
    fadeout_all(transition_speed)
  end
  #--------------------------------------------------------------------------
  # ● 结束处理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_logo
  end
  #--------------------------------------------------------------------------
  # ● 获取渐变速度
  #--------------------------------------------------------------------------
  def transition_speed
    if Input.trigger?(:C)
      return 0
    else
      return CONF_LOGO::FADE_SPEED_LOGO
    end
  end
  #--------------------------------------------------------------------------
  # ● 生成LOGO
  #--------------------------------------------------------------------------
  def create_logo
    @sprite = Sprite.new
    @sprite.bitmap = Cache.system(CONF_LOGO::FILE_LOGO)
    center_sprite(@sprite)
  end
  #--------------------------------------------------------------------------
  # ● 释放LOGO
  #--------------------------------------------------------------------------
  def dispose_logo
    @sprite.bitmap.dispose
    @sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● 精灵移动到屏幕中央
  #--------------------------------------------------------------------------
  def center_sprite(sprite)
    sprite.ox = sprite.bitmap.width / 2
    sprite.oy = sprite.bitmap.height / 2
    sprite.x = Graphics.width / 2
    sprite.y = Graphics.height / 2
  end
  #--------------------------------------------------------------------------
  # ● 播放LOGO显示时的音效
  #--------------------------------------------------------------------------
  def play_logo_music
    @use_se = true
    @use_me = false

    logo_music = RPG::SE.new(CONF_LOGO::MU_LOGO)
    logo_music.play rescue @use_se = false

    unless @use_se
      @use_me = true
      logo_music = RPG::ME.new(CONF_LOGO::MU_LOGO)
      logo_music.play rescue @use_me = false
    end

  end
  #--------------------------------------------------------------------------
  # ● 淡出声音和图形
  #--------------------------------------------------------------------------
  def fadeout_all(time)
    RPG::ME.fade(time) if @use_me
    Graphics.fadeout(time)
    RPG::SE.stop if @use_se
    RPG::ME.stop if @use_me
  end
end

#==============================================================================
# ■ SceneManager
#------------------------------------------------------------------------------
#  场景切换的管理器。RGSS3 内置了新功能,在使用 call 方法切换新场景时,可以
#   用 return 方法返回上一个场景。
#==============================================================================

module SceneManager
  @reset_flg = true
  #--------------------------------------------------------------------------
  # ● 获取最初场景的所属类
  #--------------------------------------------------------------------------
  def self.first_scene_class
    if CONF_LOGO::USE_LOGO and @reset_flg
      @reset_flg = false
      # 如果显示LOGO
      if CONF_LOGO::TEST_LOGO
        # 如果在测试时显示LOGO
        $BTEST ? Scene_Battle : Scene_Logo
      else
        # 如果不在测试时显示LOGO
        $BTEST ? Scene_Battle : ( $TEST ? Scene_Title : Scene_Logo )
      end
    else
      # 如果不显示LOGO
      $BTEST ? Scene_Battle : Scene_Title
    end
  end
end

如何优雅的研究 RGSS3 (七) 添加LOGO画面,布布扣,bubuko.com

时间: 2024-12-27 09:26:32

如何优雅的研究 RGSS3 (七) 添加LOGO画面的相关文章

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

*我真的不会 ruby 呀* #encoding:utf-8 #============================================================================== # ■ Suffix_Automaton #------------------------------------------------------------------------------ # 后缀自动机. #============================

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

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

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

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

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

在上一期我们研究了向窗口中添加选项的方法,本期就来研究一下窗口类的具体细节. 所有窗口的父类 Window_Base 初始化时需要四个参数. #-------------------------------------------------------------------------- # ● 初始化对象 #-------------------------------------------------------------------------- def initialize(x,

如何优雅的研究 RGSS3 (六) 技能与物品画面剖析

物品与技能画面剖析 物品画面和技能画面有共同的父类 Scene_ItemBase,而 Scene_ItemBase 继承自 Scene_MenuBase. Scene_ItemBase 在开始时用 create_actor_window 生成了显示角色的窗口备用. Scene_ItemBase 中定义了若干方法作为处理画面的工具. 其中 show_sub_window.hide_sub_window 可以显示.隐藏一个窗口. item.user用于获取选中的物品与使用者. on_actor_ok

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

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

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

*我真的不会 ruby 呀* #encoding:utf-8 #============================================================================== # ■ Suffix_Automaton #------------------------------------------------------------------------------ # 后缀自己主动机. #==========================

Qt 3D的研究(七):渲染至纹理

Qt 3D的研究(七):渲染至纹理 最近几天都没有怎么研究Qt 3D了,但是随着Qt5.5发布的日子一天天的靠近,我也不能懈怠,希望利用Qt 3D,将能够实现的功能进行实现,并且对Qt3D获取一个新的认识.两天多没有研究了,现在信心却是满满的! 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/44156633.欢迎同行前来探讨. Qt 3D还是在发展的过程中,也没有什么文档,所以有什么问题的话,只能去问库的作者了.我就在IRC

C# winform通过ThoughtWorks.QRCode生成二维码解码可以添加logo

首先要下载ThoughtWorks.QRCode.dll文件,添加引用. ThoughtWorks.QRCode.dll下载,点击下载 界面如下: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Win