| 
 
| 赞 | 0 |  
| VIP | 0 |  
| 好人卡 | 1 |  
| 积分 | 1 |  
| 经验 | 7377 |  
| 最后登录 | 2018-11-29 |  
| 在线时间 | 210 小时 |  
 Lv1.梦旅人 
	梦石0 星屑110 在线时间210 小时注册时间2012-6-25帖子51 | 
| 
本帖最后由 Ayahiyano 于 2013-6-19 18:11 编辑
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  
 就是这个
 复制代码=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
 | 
 |