如何优雅的研究 RGSS3 (七) 添加LOGO画面
2014-07-31 22:47
344 查看
为游戏添加 LOGO 画面。
首先要设计 LOGO 场景类,我们知道场景类都是 Scene_Base 的子类。
我们来回顾一下场景的工作原理。
首先执行开始处理,接着是开始后处理,然后是不停的更新画面,最后结束前处理,然后结束处理。
下面来逐个分析这些方法。
当进入 LOGO 画面时,显然不需要也不可能回到上一个画面,因此在开始处理的方法中,我们要清空场景的切换记录。
接下来要创建出需要显示的 LOGO 图片,但是不能让它立即显示,而是要使其淡入画面,因此要冻结住图像的显示。
最后播放 LOGO 画面的音效。
在画面开始后,我们要准备图像的渐变、接受按键,并初始化计数器。
在更新画面时,除了调用的更新画面方法外,还要判断LOGO画面是否结束,结束则进入标题画面。
而只有按下跳过键或达到一定时间 LOGO 画面才会结束。而这个一定的时间我们将它设置为一个常量,每次更新画面时将计数器减一,当计数器为零时则结束 LOGO 画面。
在结束 LOGO 画面前不要忘了将图片与音乐淡出。
淡出方法也很简单。
之后在结束处理中将图片精灵消除。
整个场景中其实只有一个精灵,也就是 LOGO 图像精灵。
它在开始处理中创建。
从缓存冲取出图像创建出精灵,然后将精灵放置在屏幕中央。
该精灵在结束处理中被释放。
在 Scene_Base 中有一个执行渐变 perform_transition 方法,它调用 transition_speed 获取渐变速度。
我们将其重载为自己的版本。
LOGO 画面中的音效在开始处理时调用 play_logo_music 播放。
这样我们的 LOGO 画面类就设计好了,其中涉及到了许多常量,我们用一个专门的模块来定义它们。
重写 SceneManager 中的 first_scene_class,使得最初的场景中显示 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 (二) 为游戏结束画面添加简单的选项
- 如何优雅的研究 RGSS3 (五) 输入数字的画面
- 如何优雅的研究 RGSS3 (六) 技能与物品画面剖析
- 如何优雅的研究 RGSS3 (七) 加入LOGO屏幕
- 如何优雅的研究 RGSS3 (四) 使窗口从画面边缘弹出
- 如何优雅的研究 RGSS3 番外(一) ruby 实现的后缀自动机
- 如何优雅的研究 RGSS3 (一) 场景中窗口的工作原理
- 如何优雅的研究 RGSS3 番外(二) 显示文字信息的窗口中的纤程
- 如何优雅的研究 RGSS3 (三) 调整窗口的细节
- 怎样优雅的研究 RGSS3 (四) 使窗体从画面边缘弹出
- iOS中如何优雅的添加圆角和边框?
- 怎样优雅的研究 RGSS3 番外(一) ruby 实现的后缀自己主动机
- altium designer中如何添加logo
- 案例研究:我们应该如何设计漂亮的LOGO
- UE4如何添加开场Logo动画?
- wince 6.0 如何添加开机logo
- AltiumDesigner中PCB如何添加 Logo
- 如何优雅的为你的Recyclerview添加分割线
- 在Altium Designer 2009下如何添加Logo图
- 如何在AppDeleGate.m上添加按钮或画面(view)