=begin
■ RGDS_SP ver 0.0.1.2
動画再生スクリプト(表示系)for VX Ace
動画再生スクリプト(ベース)より下に配置してください。
=end
module RGDS_SP
@@visible = false
# ■ 動画設定クラス $game_system.movie_infoで使用
class MovieInfo
attr_reader :x
attr_reader :y
attr_reader :z
attr_reader :width_max
attr_reader :height_max
attr_reader :origin_center
attr_accessor :mode
attr_accessor :refresh_flag
def initialize
@x = Graphics.width / 2
@y = Graphics.height / 2
@z = 500
@width_max = 0
@height_max = 0
@origin_center = true
@mode = 0
@refresh_flag = false
end
# セッター
def x=(n)
@x = n
@refresh_flag = true
end
def y=(n)
@y = n
@refresh_flag = true
end
def z=(n)
@z = n
@refresh_flag = true
end
def width_max=(n)
@width_max = n
@refresh_flag = true
end
def width_max=(n)
@width_max = n
@refresh_flag = true
end
def origin_center=(flag)
@origin_center = flag
@refresh_flag = true
end
# ■ 表示位置、サイズを指定します。
#- x, y: 表示座標
#- width_max, height_max: 表示枠。この内部に収まるように拡大縮小します。
# : どちらかが0以下の場合拡大縮小は行われません。
#- orogin: 表示位置基準点 false(デフォ): 動画の左上, true: 動画の中心を上記
#- の[x,y]にあわせます
def set_position(x=0,y=0,width_max=0,height_max=0,origin=false)
@x = x
@y = y
@width_max = width_max
@height_max = height_max
@origin_center = origin
@refresh_flag = true
end
# ■ 以降の表示位置、サイズをデフォルトに戻します。
# 拡大縮小なし、左上にあわせて表示
def reset_position
@x = Graphics.width / 2
@y = Graphics.height / 2
@width_max = 0
@height_max = 0
@origin_center = true
@refresh_flag = true
end
end
class MovieSprite < ::Sprite
# 初期化
def initialize(viewport=nil)
super
self.visible = false
self.bitmap = RGDS.bitmap
fix_position()
end
# 拡大縮小処理
def change_zoom
zoom = 1.0
bw = self.bitmap.width
bh = self.bitmap.height
return if bw <= 0 or bh <= 0
if $game_system.movie_info.width_max > 0 and $game_system.movie_info.height_max > 0
zoom_w = $game_system.movie_info.width_max.to_f / bw.to_f
zoom_h = $game_system.movie_info.height_max.to_f / bh.to_f
zoom = [zoom_w, zoom_h].min
end
self.zoom_x = zoom
self.zoom_y = zoom
end
# 表示位置変更
def fix_position
self.x = $game_system.movie_info.x
self.y = $game_system.movie_info.y
self.z = $game_system.movie_info.z
if $game_system.movie_info.origin_center
self.ox = self.bitmap.width / 2
self.oy = self.bitmap.height / 2
end
change_zoom()
end
def update
if (self.visible = RGDS.visible)
if RGDS.bitmap_changed? or self.bitmap.disposed?
self.bitmap = RGDS.bitmap
fix_position()
RGDS.bitmap_changed = false
$game_system.movie_info.refresh_flag = false
elsif $game_system.movie_info.refresh_flag
fix_position()
$game_system.movie_info.refresh_flag = false
end
end
super
end
end
module_function
# ■ 動画をオープンします。初回は1~2秒ほどかかる場合もあります。
def open(filename)
RGDS.open(filename)
end
# ■ 動画を停止しクローズします。
def close
RGDS.close()
end
# ■ openされた動画を再生します。一時停止中なら再開します。
# 再生が終わると自動的にクローズします。
def run
RGDS.run()
end
# ■ 動画を一時停止します。再開はrunで行います。
def pause
RGDS.pause()
end
# ■ 動画をオープンして自動再生します。
#- 決定キーでスキップします。
def start_movie(filename, option={})
# スキップ検出オプション
if option.key?(:skip_sw)
skip_sw = option[:skip_sw].to_i
else
skip_sw = 0
end
# スキップ禁止モードオプション
if option.key?(:nsm)
nsm_mode = option[:nsm]
else
nsm_mode = false
end
if skip_sw > 0
$game_switches[skip_sw] = true
end
scene_temp = SceneManager.scene
if scene_temp.is_a?(Scene_Map) or scene_temp.is_a?(Scene_Battle)
msgv = SceneManager.scene.instance_variable_get(:@message_window)
msgv.update
tempv = msgv.visible
msgv.visible = false
# オープン
RGDS.open(filename)
RGDS.run()
# 終了またはボタンが押されるまでループ
loop do
break if scene_temp != SceneManager.scene
# 画面の更新
if SceneManager.scene.is_a?(Scene_Map)
SceneManager.scene.update_for_fade
else
SceneManager.scene.update_basic
end
if !RGDS.active? # 再生終了
if skip_sw > 0
$game_switches[skip_sw] = false
end
break
end
unless nsm_mode
if Input.trigger?(Input::A)# or Input.trigger?(Input::B)
break
end
end
end
RGDS.close()
msgv.visible = tempv
end
end
# ■ 以降の表示位置、サイズを指定します。
#- x, y: 表示座標
#- width_max, height_max: 表示枠。この内部に収まるように拡大縮小します。
# : どちらかが0以下の場合拡大縮小は行われません。
#- origin: 表示位置基準点 false: 動画の左上, true: 動画の中心を上記
#- の[x,y]にあわせます
def set_position(x=0,y=0,width_max=0,height_max=0,origin=false)
$game_system.movie_info.set_position(x,y,width_max,height_max,origin)
end
# ■ 以降の表示位置、サイズをデフォルトに戻します。
# 拡大縮小なし、中央にあわせて表示
def reset_position
$game_system.movie_info.reset_position()
end
# 再生音量取得
def get_volume
return RGDS.get_volume()
end
# 再生音量設定
def set_volume(volume)
return RGDS.set_volume(volume)
end
end
class Game_System
def init_movie_info
@movie_info = RGDS_SP::MovieInfo.new
end
def movie_info
init_movie_info() if @movie_info.nil?
return @movie_info
end
end
class Spriteset_Map
alias :_hn_movie__initialize :initialize unless private_method_defined?(:_hn_movie__initialize)
def initialize
# 元の処理
_hn_movie__initialize
# 追加処理
create_movie
update_movie
end
alias :_hn_movie__dispose :dispose unless method_defined?(:_hn_movie__dispose)
def dispose
dispose_movie
_hn_movie__dispose
end
alias :_hn_movie__update :update unless method_defined?(:_hn_movie__update)
def update
update_movie
_hn_movie__update
end
# ■ シーン移行時に動画を待機モードにします。
def create_movie
@sp_movie = RGDS_SP::MovieSprite.new()
@sp_movie.viewport = @viewport1
RGDS.system_resume
end
# ■ シーン移行時に動画を待機モードにします。
def dispose_movie
RGDS.system_pause
@sp_movie.viewport = nil
@sp_movie.dispose
@sp_movie = nil
end
def update_movie
if RGDS.active?
RGDS.update
end
@sp_movie.update unless @sp_movie.nil?
end
end
class Spriteset_Battle
alias :_hn_movie__initialize :initialize unless private_method_defined?(:_hn_movie__initialize)
def initialize
# 元の処理
_hn_movie__initialize
# 追加処理
create_movie
update_movie
end
alias :_hn_movie__dispose :dispose unless method_defined?(:_hn_movie__dispose)
def dispose
dispose_movie
_hn_movie__dispose
end
alias :_hn_movie__update :update unless method_defined?(:_hn_movie__update)
def update
update_movie
_hn_movie__update
end
# ■ シーン移行時に動画を待機モードにします。
def create_movie
@sp_movie = RGDS_SP::MovieSprite.new()
@sp_movie.viewport = @viewport1
RGDS.system_resume
end
# ■ シーン移行時に動画を待機モードにします。
def dispose_movie
RGDS.system_pause
@sp_movie.viewport = nil
@sp_movie.dispose
@sp_movie = nil
end
def update_movie
if RGDS.active?
RGDS.update
end
@sp_movie.update unless @sp_movie.nil?
end
end