398 lines
No EOL
17 KiB
Ruby
398 lines
No EOL
17 KiB
Ruby
# coding: utf-8
|
||
#===============================================================================
|
||
# ■ Tweenアニメーションさん for RGSS3
|
||
#-------------------------------------------------------------------------------
|
||
# 2013/05/11 Ru/むっくRu
|
||
#-------------------------------------------------------------------------------
|
||
# FlashなどではおなじみのTweenアニメーションを扱う機能をRGSS3に追加します。
|
||
# 指定したプロパティを指定時間で変化させることが可能になります。
|
||
# 詳細は解説記事をどうぞ。
|
||
#-------------------------------------------------------------------------------
|
||
# 【注意】
|
||
# このスクリプトはRGSSに機能を追加するものであり、
|
||
# このスクリプトだけで何か効果があるわけではありません。
|
||
#-------------------------------------------------------------------------------
|
||
# 【更新履歴】
|
||
# 2013/05/11 メソッド名間違えていたのを修正
|
||
# 2013/05/06 公開
|
||
#-------------------------------------------------------------------------------
|
||
|
||
#===============================================================================
|
||
# ↓ 以下、スクリプト部 ↓
|
||
#===============================================================================
|
||
|
||
module HZM_VXA
|
||
module Tween
|
||
#---------------------------------------------------------------------------
|
||
# ■ 全Tweenアニメーションの管理
|
||
#---------------------------------------------------------------------------
|
||
module Manager
|
||
#-------------------------------------------------------------------------
|
||
# ● 初期化
|
||
#-------------------------------------------------------------------------
|
||
def self.init
|
||
@list = []
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● フレーム更新
|
||
#-------------------------------------------------------------------------
|
||
def self.update
|
||
@list.delete_if do |animation|
|
||
animation.update_from_manager
|
||
!animation.play?
|
||
end
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● アニメーションの追加
|
||
#-------------------------------------------------------------------------
|
||
def self.push(animation)
|
||
@list.push animation unless @list.include?(animation)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● 再生中?
|
||
#-------------------------------------------------------------------------
|
||
def self.play?
|
||
@list.size > 0
|
||
end
|
||
end
|
||
#---------------------------------------------------------------------------
|
||
# ■ 各Tweenアニメーション用クラス
|
||
#---------------------------------------------------------------------------
|
||
class Animation
|
||
#-------------------------------------------------------------------------
|
||
# ● 生成
|
||
#-------------------------------------------------------------------------
|
||
def initialize(obj, *params)
|
||
@obj = obj
|
||
@animation_params = params
|
||
@playing = false
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● 再生開始
|
||
#-------------------------------------------------------------------------
|
||
def play
|
||
@playing = true
|
||
@timer = 0
|
||
@index = 0
|
||
init_animation
|
||
Manager.push(self)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● 再生停止
|
||
#-------------------------------------------------------------------------
|
||
def stop
|
||
@playing = false
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● 再生中か
|
||
#-------------------------------------------------------------------------
|
||
def play?
|
||
@playing
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● 更新(Managerから呼び出される)
|
||
#-------------------------------------------------------------------------
|
||
def update_from_manager
|
||
# 停止中は処理しない
|
||
return unless @playing
|
||
# 再生時間の増加
|
||
@timer += 1
|
||
# 各要素を更新
|
||
begin
|
||
@playing_params.each do |key, value|
|
||
n = @transition_method.call(@timer, value[1], value[2], @timer_max)
|
||
value[0].call(n.to_i)
|
||
end
|
||
rescue RGSSError
|
||
# 既に解放済みなので強制終了する
|
||
stop
|
||
return
|
||
end
|
||
# 再生が完了したら次のステップへ
|
||
unless @timer < @timer_max
|
||
@index += 1
|
||
init_animation
|
||
end
|
||
end
|
||
|
||
private
|
||
#-------------------------------------------------------------------------
|
||
# ● アニメーション開始の準備
|
||
#-------------------------------------------------------------------------
|
||
def init_animation
|
||
# 全アニメーションが終了していたら再生停止
|
||
return stop unless @index < @animation_params.size
|
||
# 初期化
|
||
@timer = 0.0
|
||
# 再生時間の確認
|
||
@timer_max = @animation_params[@index][:time].to_f
|
||
# トランジションメソッドの確認
|
||
transition = @animation_params[@index][:transition]
|
||
transition = nil if transition == :default
|
||
if transition == nil
|
||
transition = Transition.default
|
||
elsif transition.class == Symbol
|
||
begin
|
||
transition = Transition.method_cache(transition)
|
||
rescue
|
||
transition = Transition.default
|
||
end
|
||
end
|
||
@transition_method = transition
|
||
# 各要素の初期値、ターゲット値を準備
|
||
params = {}
|
||
@animation_params[@index].each do |key, value|
|
||
next if key == :time or key == :transition
|
||
method = @obj.method("#{key}=".to_sym)
|
||
start = @obj.method(key).call.to_i
|
||
change = value.to_i - start
|
||
params[key] = [method, start.to_f, change.to_f]
|
||
end
|
||
@playing_params = params
|
||
true
|
||
end
|
||
end
|
||
#---------------------------------------------------------------------------
|
||
# ■ 標準トランジション用モジュール
|
||
# 新たに追加したくなった場合は、ここに追加する
|
||
#---------------------------------------------------------------------------
|
||
# 参考元URL
|
||
# http://www.robertpenner.com/easing/
|
||
# http://gizma.com/easing/
|
||
#---------------------------------------------------------------------------
|
||
module Transition
|
||
@@caches = {}
|
||
#-------------------------------------------------------------------------
|
||
# ● 標準トランジションの取得
|
||
#-------------------------------------------------------------------------
|
||
def self.default
|
||
self.method_cache(:linear)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● メソッドキャッシュの取得
|
||
#-------------------------------------------------------------------------
|
||
def self.method_cache(name)
|
||
@@caches[name] ||= self.method(name)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Linear
|
||
#-------------------------------------------------------------------------
|
||
def self.linear(time, begin_value, change_value, duration)
|
||
begin_value + change_value * time / duration
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In Quad
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_quad(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
begin_value + change_value * time * time
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing Out Quad
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_out_quad(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
begin_value - change_value * time * (time - 2)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In/Out Quad
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_out_quad(time, begin_value, change_value, duration)
|
||
time /= duration / 2
|
||
change_value /= 2
|
||
if time < 1
|
||
begin_value + change_value * time * time
|
||
else
|
||
time -= 1
|
||
begin_value - change_value * (time * (time - 2) - 1)
|
||
end
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In Cubic
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_cubic(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
begin_value + change_value * (time ** 3)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing Out Cubic
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_out_cubic(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
time -= 1
|
||
begin_value + change_value * (time ** 3 + 1)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In/Out Cubic
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_out_cubic(time, begin_value, change_value, duration)
|
||
time /= duration / 2
|
||
change_value /= 2
|
||
if time < 1
|
||
begin_value + change_value * (time ** 3)
|
||
else
|
||
time -= 2
|
||
begin_value + change_value * (time ** 3 + 2)
|
||
end
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In Quartic
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_quart(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
begin_value + change_value * (time ** 4)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing Out Quartic
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_out_quart(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
time -= 1
|
||
begin_value - change_value * (time ** 4 - 1)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In/Out Quartic
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_out_quart(time, begin_value, change_value, duration)
|
||
time /= duration / 2
|
||
change_value /= 2
|
||
if time < 1
|
||
begin_value + change_value * (time ** 4)
|
||
else
|
||
time -= 2
|
||
begin_value - change_value * (time ** 4 - 2)
|
||
end
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In Quintic
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_quint(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
begin_value + change_value * (time ** 5)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing Out Quintic
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_out_quint(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
time -= 1
|
||
begin_value + change_value * (time ** 5 + 1)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In/Out Quintic
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_out_quint(time, begin_value, change_value, duration)
|
||
time /= duration / 2
|
||
change_value /= 2
|
||
if time < 1
|
||
begin_value + change_value * (time ** 5)
|
||
else
|
||
time -= 2
|
||
begin_value + change_value * (time ** 5 + 2)
|
||
end
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In Sine
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_sine(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
begin_value + change_value * (1 - Math.cos(time * (Math::PI / 2)))
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing Out Sine
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_out_sine(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
begin_value + change_value * Math.sin(time * (Math::PI / 2))
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In/Out Sine
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_out_sine(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
begin_value - change_value / 2 * (Math.cos(Math::PI * time) - 1)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In Exponential
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_expo(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
begin_value + change_value * (2 ** (10 * (time - 1)))
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing Out Exponential
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_out_expo(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
begin_value + change_value * (1 - (2 ** (-10 * time)))
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In/Out Exponential
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_out_expo(time, begin_value, change_value, duration)
|
||
time /= duration / 2
|
||
change_value /= 2
|
||
if time < 1
|
||
begin_value + change_value * (2 ** (10 * (time - 1)))
|
||
else
|
||
begin_value + change_value * (-2 ** (10 * (time - 1)) + 2)
|
||
end
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In Circular
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_circ(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
begin_value - change_value * (Math.sqrt(1 - time * time) - 1)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing Out Circular
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_out_circ(time, begin_value, change_value, duration)
|
||
time /= duration
|
||
time -= 1
|
||
begin_value + change_value * Math.sqrt(1 - time * time)
|
||
end
|
||
#-------------------------------------------------------------------------
|
||
# ● Easing In/Out Circular
|
||
#-------------------------------------------------------------------------
|
||
def self.ease_in_out_circ(time, begin_value, change_value, duration)
|
||
time /= duration / 2
|
||
change_value /= 2
|
||
if (time < 1)
|
||
begin_value - change_value * (Math.sqrt(1 - time * time) - 1)
|
||
else
|
||
begin_value + change_value * (Math.sqrt(1 - time * time) + 1)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
#===============================================================================
|
||
# ■ SceneManager
|
||
#===============================================================================
|
||
class << SceneManager
|
||
#-----------------------------------------------------------------------------
|
||
# ● 実行(エイリアス)
|
||
#-----------------------------------------------------------------------------
|
||
alias hzm_vxa_tween_run run
|
||
def run
|
||
HZM_VXA::Tween::Manager.init
|
||
hzm_vxa_tween_run
|
||
end
|
||
end
|
||
|
||
#===============================================================================
|
||
# ■ Scene_Base
|
||
#===============================================================================
|
||
class Scene_Base
|
||
#-----------------------------------------------------------------------------
|
||
# ● フレーム更新(基本)(エイリアス)
|
||
#-----------------------------------------------------------------------------
|
||
alias hzm_vxa_tween_update_basic update_basic
|
||
def update_basic
|
||
HZM_VXA::Tween::Manager.update
|
||
hzm_vxa_tween_update_basic
|
||
end
|
||
end |