赞 | 0 |
VIP | 0 |
好人卡 | 1 |
积分 | 1 |
经验 | 7377 |
最后登录 | 2018-11-29 |
在线时间 | 210 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 110
- 在线时间
- 210 小时
- 注册时间
- 2012-6-25
- 帖子
- 51
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 Ayahiyano 于 2013-6-19 18:11 编辑
就是这个- =begin
- ■ RGDS_Base ver 0.0.0.9
- 動画再生スクリプト(ベース)for DLL(ver0.0.0.8)
- =end
- module RGDS
- DLL_NAME = "HNRGDS"
-
- module State
- NO_CONNECT = 0
- OPENING = 5
- READY = 10
- RUN = 21
- PAUSE = 22
- end
-
- STATE_NO_CONNECT = 0
- STATE_OPENING = 5
- STATE_READY = 10
- STATE_RUN = 21
- STATE_PAUSE = 22
-
- @@open = Win32API.new(DLL_NAME, 'OpenMovieA', 'ip', 'l')
- @@get_size = Win32API.new(DLL_NAME, 'GetVideoSize', 'p', 'i')
- @@close = Win32API.new(DLL_NAME, 'CloseMovie', 'v', 'i')
- @@update_video = Win32API.new(DLL_NAME, 'UpdateVideo', 'n', 'i')
- @@run = Win32API.new(DLL_NAME, 'RunMovie', 'v', 'i')
- @@pause = Win32API.new(DLL_NAME, 'PauseMovie', 'v', 'i')
- @@get_volume = Win32API.new(DLL_NAME, 'GetVolume', 'v', 'l')
- @@set_volume = Win32API.new(DLL_NAME, 'SetVolume', 'l', 'l')
- @@state = Win32API.new(DLL_NAME, 'GetState', 'v', 'i')
-
- @@state = 0
- @@system_pause = false
- @@volume = 10000
- @@visible = true
- @@x = 0
- @@y = 0
- @@width_max = 0
- @@height_max = 0
- @@filename = ""
- @@bitmap = Bitmap.new(16, 16)
- @@bitmap.clear
- class << @@bitmap
- alias :_dispose :dispose unless method_defined?(:_dispose)
- def dispose
- end
- end
- @@bitmap_changed = true
-
- def self.open(filename)
- if @@filename != filename
- self.close
- end
- result = @@open.call(filename.size, filename);
- return result if result != 0
- @@state = State::OPENING
- @@filename = filename
- return result
- end
-
- def self.close
- @@state = State::NO_CONNECT
- @@filename = ""
- @@close.call()
- @@bitmap.clear
- end
-
- def self.bitmap
- @@bitmap
- end
- def self.bitmap_changed?
- @@bitmap_changed
- end
- def self.bitmap_changed=(value)
- @@bitmap_changed = value
- end
-
- def self.filename
- @@filename
- end
- def self.update
- return 0 if !@@visible
- if @@state >= State::READY
- result = @@update_video.call(@@bitmap.object_id)
- if (result == 0)
- return 0
- else
- self.close()
- return result
- end
- else
- return -1
- end
- end
- def self.wait_opening
- return unless @@state == State::OPENING
- buff_size = "\000" * 8
- while(@@state == State::OPENING) do
- result = @@get_size.call(buff_size)
- if result == 0
- break;
- elsif result < 0
- error_code = result
- error_code = result & 0xFFFF
- if DSError::JP_ERROR.key?(error_code)
- print "エラー(#{error_code}):#{DSError::JP_ERROR[error_code]}"
- else
- print "エラー(#{error_code}):#{result}"
- end
- return result
- end
- 5.times {Graphics.update}
- end
-
- width, height = buff_size.unpack("ii")
- if ( (@@bitmap.width != width) or (@@bitmap.height != height) )
- @@bitmap._dispose
- @@bitmap = Bitmap.new(width, height)
- class << @@bitmap
- alias :_dispose :dispose unless method_defined?(:_dispose)
- def dispose
- end
- end
- @@bitmap_changed = true
- end
- @@bitmap.clear
- @@state = State::READY
- return 0
- end
-
- def self.run
- self.wait_opening()
- if @@state >= State::READY
- self.set_volume(@@volume)
- @@run.call()
- @@state = State::RUN
- end
- end
-
- def self.pause
- if @@state == State::RUN
- @@pause.call()
- @@state = State::PAUSE
- end
- end
-
- def self.get_volume
- if @@state >= State::READY
- @@volume = @@get_volume.call()
- end
- return @@volume
- end
-
- def self.set_volume(volume)
- volume = 0 if volume < 0
- volume = 10000 if volume > 10000
- @@volume = volume
- if @@state >= State::READY
- @@set_volume.call(volume)
- end
- end
-
- def self.active?
- (@@state >= State::READY)
- end
- def self.system_pause
- if @@state == State::RUN
- self.pause()
- @@system_pause = true
- @@state == State::PAUSE
- end
- end
-
- def self.system_resume
- if @@system_pause
- self.run()
- @@system_pause = false
- end
- end
-
- def self.visible
- (@@visible && self.active? )
- end
-
- # リセット対策
- self.close()
- end
- module DSError
- # HNRGDS.dll で独自に定義しているエラーコード
- LOCAL_ERROR = {
- -100001 => "ERROR_NO_WINDOW",
- -100003 => "ERROR_WINDOW_OPENED",
- -100004 => "ERROR_NO_CONNECT",
- -100101 => "ERROR_CANT_OPEN_FILE",
- -100201 => "ERROR_MOVIE_LODING",
- -100205 => "ERROR_OPEN_TIMEOUT",
- -100301 => "ERROR_NOT_PLAYING",
- -100303 => "ERROR_DIFFERENT_SIZE",
- -101404 => "ERROR_FILTER_NOT_FOUND",
- -101406 => "ERROR_FILTER_UNSUPPORTED",
- }
- # DirectShowから返されるエラーの下位ビット
- JP_ERROR = {
- 554 => "このピンは、提供されたメディア タイプを使えない",
- 555 => "このサンプルはレンダリングできない",
- 558 => "タイムアウト期間が過ぎた",
- 559 => "ファイル フォーマットが無効",
- 599 => "ビデオ ストリームを再生できない(レンダラ)",
- 600 => "オーディオ ストリームを再生できない(レンダラ)",
- 603 => "DirectShow はこのプロセッサ上で MPEG ムービーを再生できない",
- 604 => "オーディオ ストリームを再生できない(フォーマット)",
- 605 => "ビデオ ストリームを再生できない(フォーマット)",
- 606 => "規格に準拠していないので DirectShow で再生できない",
- 607 => "フィルタグラフに存在しないオブジェクトに要求された関数を実行できない",
- 612 => "バッファが十分に満たされていない",
- 613 => "ファイルを再生できない(フォーマット)",
- 614 => "同じ転送をサポートしていないのでピンどうしを接続できない",
- }
- end
复制代码- =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::C) 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
复制代码 求大神教教我吧 |
|