| 赞 | 0 |
| VIP | |
| 好人卡 | |
| 积分 | 1 |
| 经验 | |
| 最后登录 | 2018-11-29 |
| 在线时间 | 210 小时 |
- 梦石
- 0
- 星屑
- 110
- 在线时间
- 210 小时
- 注册时间
- 2012-6-25
- 回帖
- 44
|
楼主 |
发表于 2013-6-16 08:32:34
|
显示全部楼层
j433463 发表于 2013-6-16 08:06 
那个代码第二行应该不可能有错,除非 @total_sec 的值为 nil,若您错误讯息是这样子,那表示确实脚本冲突了 ...
你好,能帮我看看这个脚本怎么用么,我尝试改过但是没反应
[pre lang="ruby" line="1"]=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
[/pre]
=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
=begin
■ RGDS_OP_Movie ver 0.0.1.0
RGDS_base, RGDS_SP より下に配置してください
=end
class Scene_OpeningMovie < Scene_Base
MOVIE_FILE = "Movies/opening.mpg"
NSM = false
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
def main
if $BTEST # 戦闘テストの場合
$scene = next_scene()
else # 通常のプレイの場合
super # 本来のメイン処理
end
end
def next_scene
Scene_Title.new
end
def start
$game_temp = Game_Temp.new
$game_system = Game_System.new
RGDS.open(MOVIE_FILE)
@movie_sprite = RGDS_SP::MovieSprite.new
super
end
def post_start
super
RGDS.run
end
def update
super
RGDS.update
@movie_sprite.update
if !RGDS.active? # 再生終了
SceneManager.goto(Scene_Title)
return
end
unless NSM
if Input.trigger?(Input::C) or Input.trigger?(Input::B)
SceneManager.goto(Scene_Title)
return
end
end
end
def pre_terminate
RGDS.close()
@movie_sprite.dispose
super
end
end
module SceneManager
#--------------------------------------------------------------------------
# ● 最初のシーンクラスを取得
#--------------------------------------------------------------------------
def self.first_scene_class
$BTEST ? Scene_Battle : Scene_OpeningMovie
end
end
|
|