#==============================================================================
# 技能名漂移
#------------------------------------------------------------------------------
# 效果:使用技能时,技能名显示在一个自动适应长度的窗口中,
# 从左飞入屏幕上方中央,短暂停留后向右飞出。
#==============================================================================
# 定义用于显示技能名的窗口类
class SkillName_Window < Window_Base
def initialize(skill_name)
# 先测量文字尺寸
dummy = Bitmap.new(32, 32)
dummy.font.size = 32
dummy.font.bold = true
rect = dummy.text_size(skill_name)
w = rect.width + 32 + 32 # 左右各留 16 像素内边距
h = rect.height + 32
dummy.dispose
# 创建窗口:左边距临时设为0,稍后由动画控制位置
super(0, 0, w, h)
self.contents = Bitmap.new(w - 32, h - 32)
self.contents.font.size = 32
self.contents.font.bold = true
# 绘制黑色描边 + 白色文字
outline = Color.new(0, 0, 0)
text_c = Color.new(255, 255, 255)
cx = (self.contents.width - rect.width) / 2
cy = (self.contents.height - rect.height) / 2
[-1, 1].each do |dx|
[-1, 1].each do |dy|
self.contents.font.color = outline
self.contents.draw_text(cx + dx, cy + dy, rect.width, rect.height, skill_name, 1)
end
end
self.contents.font.color = text_c
self.contents.draw_text(cx, cy, rect.width, rect.height, skill_name, 1)
# 设置窗口纵向位置(屏幕上方)
self.y = 25
self.z = 10000
# 起始位置:屏幕左侧外
self.x = -self.width
# 停留帧数
@stop_time = 90
@timer = 0
@phase = :fly_in
end
# 更新动画,返回 true 表示动画已结束并需要释放
def update_anim
case @phase
when :fly_in
self.x += 16
if self.x >= 320 - self.width / 2
self.x = 320 - self.width / 2
@phase = :stop
end
when :stop
@timer += 1
if @timer >= @stop_time
@phase = :fly_out
end
when :fly_out
self.x += 16
if self.x > 640
return true # 飞出屏幕,可以释放
end
end
return false
end
end
class Scene_Battle
#--------------------------------------------------------------------------
# ● 初始化 / 释放
#--------------------------------------------------------------------------
alias skill_window_main main
def main
@skill_name_window = nil
skill_window_main
if @skill_name_window
@skill_name_window.dispose
@skill_name_window = nil
end
end
#--------------------------------------------------------------------------
# ● 帧更新
#--------------------------------------------------------------------------
alias skill_window_update update
def update
skill_window_update
update_skill_window
end
#--------------------------------------------------------------------------
# ● 显示技能名窗口
#--------------------------------------------------------------------------
def show_skill_name(name)
if @skill_name_window
@skill_name_window.dispose
@skill_name_window = nil
end
@skill_name_window = SkillName_Window.new(name)
end
#--------------------------------------------------------------------------
# ● 更新技能名窗口动画
#--------------------------------------------------------------------------
def update_skill_window
return unless @skill_name_window
if @skill_name_window.update_anim
@skill_name_window.dispose
@skill_name_window = nil
end
end
#--------------------------------------------------------------------------
# ● 触发时机:我方或敌方使用技能时
#--------------------------------------------------------------------------
if method_defined?(:update_phase4_step2)
alias skill_window_step2 update_phase4_step2
def update_phase4_step2
skill_window_step2
if @active_battler.current_action.kind == 1 &&
@active_battler.current_action.skill_id > 0
skill = $data_skills[@active_battler.current_action.skill_id]
show_skill_name(skill.name)
end
end
end
end