#==============================================================================
# RMXP时钟 原作 by 沉影不器 XP化 by satgo1546
#------------------------------------------------------------------------------
# 功能描述: 显示一个带指针的时钟
# 素材准备: 时钟指针分别命名为 hour_hand、minute_hand、second_hand
# 时钟背景命名为 clock_bg,另需要一个盖住指针的圆扣命名为 top_button
# 放入Windowskins文件夹
# 使用方法: Main之前插入脚本,在需要时钟的场景中调用:
# Sprite_Clock.new(x坐标, y坐标, 不透明度)
# (参考范例Scene_Map添加时钟)
# 脚本第19行设定控制时钟显示的变量号
#==============================================================================
# □ Sprite_Clock
#==============================================================================
class Sprite_Clock
#--------------------------------------------------------------------------
# ◎ 常量
#--------------------------------------------------------------------------
SHOW_SWITCH_ID = 10
#--------------------------------------------------------------------------
# ◎ 初始化对象
# x : 时钟中心的 X 坐标
# y : 时钟中心的 Y 坐标
# alpha : 不透明度
#--------------------------------------------------------------------------
def initialize(x, y, alpha = 255)
@x = x
@y = y
@alpha = alpha
# 暂停标志
@time_pause = false
# 为指针更新初始化计数器
@second_count = 0
@minute_count = 0
@hour_count = 0
create_clock_bg
# 本来想控制是否生成秒针
for type in 0..2
create_hands(type)
end
create_top_button
# 初始化时间
set_time
# 显示标志
change_visible
end
#--------------------------------------------------------------------------
# ◎ 释放
#--------------------------------------------------------------------------
def dispose
dispose_clock_bg
dispose_hands
dispose_top_button
end
#--------------------------------------------------------------------------
# ◎ 刷新画面
#--------------------------------------------------------------------------
def update
# 按确定键时切换暂停标志
if Input.repeat?(Input::L)
@time_pause = !@time_pause
end
return if @time_pause
# 以秒为单位更新指针
update_time_now
# 检查显示
change_visible
end
#--------------------------------------------------------------------------
# ◎ 设定时间
#--------------------------------------------------------------------------
def set_time
time = Time.now
@second = time.sec
@second = 0 if @second == 60
@minute = time.min
@hour = time.hour
@second_hand.angle = -@second*6
@minute_hand.angle = -@minute*6 - @second.to_f/10
@hour_hand.angle = -@hour*30 - (@minute.to_f/60)*30 - @second.to_f*(1.0/144)
end
#--------------------------------------------------------------------------
# ◎ 生成时钟背景
#--------------------------------------------------------------------------
def create_clock_bg
@clock_bg = Sprite.new
@clock_bg.bitmap = RPG::Cache.windowskin("clock_bg")
@clock_bg.opacity = @alpha
@clock_bg.x = @x - @clock_bg.bitmap.width/2
@clock_bg.y = @y - @clock_bg.bitmap.height/2
@clock_bg.z = 999
end
#--------------------------------------------------------------------------
# ◎ 生成顶端固定扣
#--------------------------------------------------------------------------
def create_top_button
@top_button = Sprite.new
@top_button.bitmap = RPG::Cache.windowskin("top_button")
@top_button.opacity = @alpha
@top_button.x = @x - @top_button.bitmap.width/2
@top_button.y = @y - @top_button.bitmap.height/2
@top_button.z = @second_hand.z + 1
end
#--------------------------------------------------------------------------
# ◎ 生成指针
# type : 类型(0:时针; 1:分针; 2: 秒针)
#--------------------------------------------------------------------------
def create_hands(type)
case type
when 0
@hour_hand = Sprite.new
@hour_hand.bitmap = RPG::Cache.windowskin("hour_hand")
@hour_hand.opacity = @alpha
@hour_hand.angle_center(@x, @y)
@hour_hand.z = @clock_bg.z + 1
when 1
@minute_hand = Sprite.new
@minute_hand.bitmap = RPG::Cache.windowskin("minute_hand")
@minute_hand.opacity = @alpha
@minute_hand.angle_center(@x, @y)
@minute_hand.z = @hour_hand.z + 1
when 2
@second_hand = Sprite.new
@second_hand.bitmap = RPG::Cache.windowskin("second_hand")
@second_hand.opacity = @alpha
@second_hand.angle_center(@x, @y)
@second_hand.z = @minute_hand.z + 1
end
end
#--------------------------------------------------------------------------
# ◎ 释放背景
#--------------------------------------------------------------------------
def dispose_clock_bg
@clock_bg.dispose
end
#--------------------------------------------------------------------------
# ◎ 释放指针
#--------------------------------------------------------------------------
def dispose_hands
@hour_hand.dispose if @hour_hand != nil
@minute_hand.dispose if @minute_hand != nil
@second_hand.dispose if @second_hand != nil
end
#--------------------------------------------------------------------------
# ◎ 释放顶端固定扣
#--------------------------------------------------------------------------
def dispose_top_button
@top_button.dispose
end
#--------------------------------------------------------------------------
# ◎ 更新指针
#--------------------------------------------------------------------------
def update_hands
@hour_hand.angle -= 1.0/144
@minute_hand.angle -= 1.0/10
@second_hand.angle -= 6
end
#--------------------------------------------------------------------------
# ◎ 更新时间
#--------------------------------------------------------------------------
def update_time_now
time = Time.now
second = time.sec
if second != @second
@second = second
update_hands
end
end
#--------------------------------------------------------------------------
# ◎ 更改不透明度
#--------------------------------------------------------------------------
def alpha=(alpha)
@alpha = alpha if alpha.is_a?(Integer)
end
#--------------------------------------------------------------------------
# ◎ 更改可见标志
#--------------------------------------------------------------------------
def change_visible
if @clock_show == $game_switches[SHOW_SWITCH_ID]
return
else
@clock_show = $game_switches[SHOW_SWITCH_ID]
end
for i in [@clock_bg, @hour_hand, @minute_hand, @second_hand, @top_button]
i.visible = $game_switches[SHOW_SWITCH_ID]
end
end
end
#==============================================================================
# ■ Sprite
#==============================================================================
class Sprite < Object
#--------------------------------------------------------------------------
# ◎ 设定中心旋转
#--------------------------------------------------------------------------
def angle_center(x, y)
self.ox = self.bitmap.width/2
self.oy = self.bitmap.height/2
self.x = x
self.y = y
end
end