#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆ カーソルアニメーション - KMS_CursorAnimation ◆ VX Ace ◆
#_/ ◇ Last update : 2012/02/19 (TOMY@Kamesoft) ◇
#_/----------------------------------------------------------------------------
#_/ 光标的位置显示动画。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#==============================================================================
# ★ 設定項目 - BEGIN Setting ★
#==============================================================================
module KMS_CursorAnimation
# ◆ 最初からカーソルアニメを表示する
# true : タイトルなどでもアニメを表示する。
# false : ゲーム中に明示的にオンするまで表示しない。
DEFAULT_ANIMATION = true
# ◆ アニメファイル名
# "Graphics/System" から読み込む。
ANIMATION_FILE = "CursorAnimation"
# ◆ 动画的框架数
FRAME_COUNT = 10
# ◆ アニメーションウェイト
# 数值越大,动画越晚。
ANIMATION_WAIT = 4
# ◆ 不透明度
OPACITY = 255
# ◆ 合成方法
# 0..通常 1..加算 2..減算
BLEND_TYPE = 1
# ◆ 基準位置
# 0..上 1..中央 2..下
BASE_POSITION = 0
# ◆ 表示位置補正 [x, y]
POSITION_REV = [0, -10]
end
#==============================================================================
# ☆ 設定ここまで - END Setting ☆
#==============================================================================
$kms_imported = {} if $kms_imported == nil
$kms_imported["CursorAnimation"] = true
# *****************************************************************************
#==============================================================================
# □ KMS_Commands
#==============================================================================
module KMS_Commands
module_function
#--------------------------------------------------------------------------
# ○ カーソルアニメを表示
#--------------------------------------------------------------------------
def show_cursor_animation
$game_system.cursor_animation_visible = true
end
#--------------------------------------------------------------------------
# ○ カーソルアニメを非表示
#--------------------------------------------------------------------------
def hide_cursor_animation
$game_system.cursor_animation_visible = false
end
#--------------------------------------------------------------------------
# ○ カーソルアニメ表示状態の取得
#--------------------------------------------------------------------------
def cursor_animation_visible?
return $game_system.cursor_animation_visible
end
end
#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
# イベントコマンドから直接コマンドを叩けるようにする
include KMS_Commands
end
#==============================================================================
# ■ Window_Base
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ○ クラス変数
#--------------------------------------------------------------------------
@@__cursor_animation = nil # カーソルアニメ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# x : ウィンドウの X 座標
# y : ウィンドウの Y 座標
# width : ウィンドウの幅
# height : ウィンドウの高さ
#--------------------------------------------------------------------------
alias initialize_KMS_CursorAnimation initialize
def initialize(x, y, width, height)
initialize_KMS_CursorAnimation(x, y, width, height)
@@__cursor_animation.add_window(self)
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
unless method_defined?(:dispose_KMS_CursorAnimation)
alias dispose_KMS_CursorAnimation dispose
end
def dispose
@@__cursor_animation.remove_window(self)
dispose_KMS_CursorAnimation
end
#--------------------------------------------------------------------------
# ○ カーソルアニメを生成
#--------------------------------------------------------------------------
def self.create_cursor_animation
@@__cursor_animation = Cursor_Animation.new
end
#--------------------------------------------------------------------------
# ○ カーソルアニメを破棄
#--------------------------------------------------------------------------
def self.dispose_cursor_animation
@@__cursor_animation.dispose
end
#--------------------------------------------------------------------------
# ○ カーソルアニメを表示
#--------------------------------------------------------------------------
def self.show_cursor_animation
@@__cursor_animation.visible = true
@@__cursor_animation.update
end
#--------------------------------------------------------------------------
# ○ カーソルアニメを隠す
#--------------------------------------------------------------------------
def self.hide_cursor_animation
@@__cursor_animation.visible = false
@@__cursor_animation.update
end
#--------------------------------------------------------------------------
# ○ カーソルアニメを更新
#--------------------------------------------------------------------------
def self.update_cursor_animation
@@__cursor_animation.update
end
end
#==============================================================================
# ■ Game_System
#==============================================================================
class Game_System
#--------------------------------------------------------------------------
# ○ 公開インスタンス変数
#--------------------------------------------------------------------------
attr_writer :cursor_animation_visible
#--------------------------------------------------------------------------
# ○ オブジェクト初期化
#--------------------------------------------------------------------------
alias initialize_KMS_CursorAnimation initialize
def initialize
initialize_KMS_CursorAnimation
@cursor_animation_visible = KMS_CursorAnimation::DEFAULT_ANIMATION
end
#--------------------------------------------------------------------------
# ○ カーソルアニメ可否フラグを取得
#--------------------------------------------------------------------------
def cursor_animation_visible
if @cursor_animation_visible.nil?
@cursor_animation_visible = KMS_CursorAnimation::DEFAULT_ANIMATION
end
return @cursor_animation_visible
end
end
#==============================================================================
# □ Sprite_CursorAnimation
#------------------------------------------------------------------------------
# カーソルアニメーション用の処理を追加したスプライトのクラスです。
#==============================================================================
class Sprite_CursorAnimation < Sprite
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# viewport : ビューポート
#--------------------------------------------------------------------------
def initialize(viewport = nil)
super(viewport)
@duration = 0
@frame_count = 0
self.bitmap = Cache.system(KMS_CursorAnimation::ANIMATION_FILE)
self.src_rect.width = bitmap.width / 8
self.src_rect.height = bitmap.height /
([KMS_CursorAnimation::FRAME_COUNT - 1, 0].max / 8 + 1)
self.ox = src_rect.width / 2
self.oy = src_rect.height / 2
self.opacity = KMS_CursorAnimation::OPACITY
self.blend_type = KMS_CursorAnimation::BLEND_TYPE
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
super
return unless visible
@frame_count += 1
return if @frame_count % KMS_CursorAnimation::ANIMATION_WAIT != 0
@frame_count = 0
@duration -= 1
if @duration < 0
@duration = KMS_CursorAnimation::FRAME_COUNT - 1
end
update_animation
end
#--------------------------------------------------------------------------
# ○ アニメーションを更新
#--------------------------------------------------------------------------
def update_animation
self.src_rect.x = src_rect.width * (@duration % 8)
self.src_rect.y = src_rect.height * (@duration / 8)
end
end
#==============================================================================
# □ Cursor_Animation
#------------------------------------------------------------------------------
# カーソル周りのアニメーションを扱うクラスです。
#==============================================================================
class Cursor_Animation
#--------------------------------------------------------------------------
# ○ 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :visible
#--------------------------------------------------------------------------
# ○ オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
reset
end
#--------------------------------------------------------------------------
# ○ 破棄
#--------------------------------------------------------------------------
def dispose
@target_sprite.dispose
@target_sprite = nil
@viewport.dispose
@viewport = nil
end
#--------------------------------------------------------------------------
# ○ リセット
#--------------------------------------------------------------------------
def reset
@visible = false
@viewport = Viewport.new(0, 0, 640, 480)
@windows = []
@target_sprite = Sprite_CursorAnimation.new(@viewport)
@active_window = nil
@viewport.visible = false
@viewport.z = 30000
end
#--------------------------------------------------------------------------
# ○ ウィンドウ追加
#--------------------------------------------------------------------------
def add_window(*window)
@windows |= window.find_all { |w|
w.is_a?(Window_Selectable) || w.is_a?(Window_SaveFile)
}
@windows.flatten!
end
#--------------------------------------------------------------------------
# ○ ウィンドウ削除
#--------------------------------------------------------------------------
def remove_window(*window)
@windows -= window
end
#--------------------------------------------------------------------------
# ○ フレーム更新
#--------------------------------------------------------------------------
def update
return if @viewport.nil?
@viewport.update
@target_sprite.update
# 座標調整
dest_x, dest_y = get_cursor_pos
if @target_sprite.x != dest_x
if (dest_x - @target_sprite.x).abs < 4
@target_sprite.x = dest_x
else
dist = (dest_x - @target_sprite.x) / 4
dist = (dist > 0 ? [dist, 4].max : [dist, -4].min)
@target_sprite.x += dist
end
end
if @target_sprite.y != dest_y
if (dest_y - @target_sprite.y).abs < 4
@target_sprite.y = dest_y
else
dist = (dest_y - @target_sprite.y) / 4
dist = (dist > 0 ? [dist, 4].max : [dist, -4].min)
@target_sprite.y += dist
end
end
end
#--------------------------------------------------------------------------
# ○ カーソル位置取得
# [x, y] の形で返す。
#--------------------------------------------------------------------------
def get_cursor_pos
dx = dy = 0
# 可視状態のアクティブウィンドウを取得
unless window_active?(@active_window)
@active_window = search_active_window
end
# アクティブウィンドウがなければ非表示
if @active_window.nil? || !KMS_Commands.cursor_animation_visible?
@viewport.visible = false
dx = Graphics.width / 2
dy = Graphics.height / 2
return [dx, dy]
end
@viewport.visible = @visible
# カーソル位置を計算
rect = @active_window.cursor_rect
dx = rect.x + 16 + KMS_CursorAnimation::POSITION_REV[0]
dy = rect.y + 16 + KMS_CursorAnimation::POSITION_REV[1]
vp = @active_window.viewport
if vp != nil
dx += vp.rect.x - vp.ox
dy += vp.rect.y - vp.oy
end
dx += @active_window.x - @active_window.ox
dy += @active_window.y - @active_window.oy
case KMS_CursorAnimation::BASE_POSITION
when 0 # 上
dy += @target_sprite.oy
when 1 # 中央
dy += rect.height / 2
when 2 # 下
dy += rect.height - @target_sprite.oy
end
return [dx, dy]
end
#--------------------------------------------------------------------------
# ○ ウィンドウの可視・アクティブ状態判定
#--------------------------------------------------------------------------
def window_active?(window)
return false if window.nil?
return false if window.disposed?
return false unless window.visible
if window.is_a?(Window_Selectable)
return window.active
elsif window.is_a?(Window_SaveFile)
return window.selected
end
return false
end
#--------------------------------------------------------------------------
# ○ アクティブウィンドウを探す
#--------------------------------------------------------------------------
def search_active_window
return @windows.find { |w|
if !w.visible
false
elsif w.is_a?(Window_Selectable)
w.active && w.index >= 0
elsif w.is_a?(Window_SaveFile)
w.selected
else
false
end
}
end
end
#==============================================================================
# ■ Scene_Base
#==============================================================================
class Scene_Base
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
alias start_KMS_CursorAnimation start
def start
Window_Base.create_cursor_animation
Window_Base.show_cursor_animation
start_KMS_CursorAnimation
end
#--------------------------------------------------------------------------
# ● 終了前処理
#--------------------------------------------------------------------------
alias pre_terminate_KMS_CursorAnimation pre_terminate
def pre_terminate
Window_Base.dispose_cursor_animation
pre_terminate_KMS_CursorAnimation
end
#--------------------------------------------------------------------------
# ● フレーム更新(基本)
#--------------------------------------------------------------------------
alias update_basic_KMS_CursorAnimation update_basic
def update_basic
update_basic_KMS_CursorAnimation
# カーソルアニメを更新
Window_Base.update_cursor_animation
end
end