为游戏添加 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
我们将其重载为自己的版本。
#--------------------------------------------------------------------------
# ● 获取渐变速度
#--------------------------------------------------------------------------
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