| 赞 | 1 |
| VIP | |
| 好人卡 | |
| 积分 | 1 |
| 经验 | |
| 最后登录 | 2017-10-21 |
| 在线时间 | 1617 小时 |
炎
- 梦石
- 0
- 星屑
- 98
- 在线时间
- 1617 小时
- 注册时间
- 2013-8-15
- 回帖
- 4322
|
发表于 2014-10-4 21:22:55
|
显示全部楼层
本帖最后由 永燃的狂炎 于 2014-10-4 21:41 编辑
[box=DarkRed]-脚本-[/box]
脚本①- # coding: utf-8
- =begin
- = Bitmapクラスの拡張 (DLL版)
- RPGツクールXP/VX共用
- Bitmapクラスに機能を追加します。
- - Marshaldump可能に
- - PNGファイルとして保存
- - 色調変更
- - モザイク効果
- - 色の反転
- - ぼかし効果
- - マスクを用いた切り抜き
- - ブレンディング
- ■ 注意
- このスクリプトの他に"tktk_bitmap.dll"(ver0.1.2.6以上)が必要になります。
- Author:: 半生
- Date:: 2010/12/13
- Version:: 0.1.2.6
- URL:: http://www.tktkgame.com/
- ############################################
- 2010/12/13 ver 0.1.2.6
- dllの名称を"hn_rg_bitmap.dll"から"tktk_bitmap.dll"に変更
- LARGE_BITMAP機能でメモリを確保できなかった場合の処理を追加
- 2010/10/12 ver 0.1.2.5(デンジャラスベータ版)
- 大きいサイズのBitmapオブジェクトを機能を試験的に実装(危険)
- 2010/03/24 ver 0.1.2.2
- ブレンディング機能関連の軽量化。
- 画像連結系メソッドの分離。
- 2010/03/24 ver 0.1.2.1
- ブレンディング機能関連のバグフィックス
- 2010/03/22 ver 0.1.2.0
- 加算合成等のブレンディング機能の追加
- 2010/02/07 ver 0.1.1.0
- マーシャル化の処理の一部をDLLに移動
- 2010/01/17 ver 0.1.0.0
- dllの名称を"hn_rx_bitmap.dll"から"hn_rg_bitmap.dll"に変更
- モザイク効果・色反転・ぼかし効果の追加
- ############################################
- =end
- module TKTK_Bitmap
- LARGE_BITMAP = true # 大容量のBitmap作成機能を使うかどうか
- DLL_NAME = 'tktk_bitmap'
- ERROR_ALLOCATE_FAILED = -110002
- @@png_save = Win32API.new(DLL_NAME, 'PngSaveA', 'p n i i', 'i')
- @@blur = Win32API.new(DLL_NAME, 'Blur', 'n i', 'i')
- @@change_tone = Win32API.new(DLL_NAME, 'ChangeTone', 'n i i i i', 'i')
- @@clip_mask = Win32API.new(DLL_NAME, 'ClipMask', 'n n i i i', 'i')
- @@invert = Win32API.new(DLL_NAME, 'InvertColor', 'n', 'i')
- @@mosaic = Win32API.new(DLL_NAME, 'Mosaic', 'n i i i i i i', 'i')
- @@address = Win32API.new(DLL_NAME, 'GetAddress', 'n', 'n')
- @@get_pixel_data = Win32API.new(DLL_NAME, 'GetPixelData', 'n p i', 'i')
- @@set_pixel_data = Win32API.new(DLL_NAME, 'SetPixelData', 'n p i', 'i')
- @@blend_blt = Win32API.new(DLL_NAME, 'BlendBlt', 'n i i n i i i i i i', 'i')
- #@@get_hwnd = Win32API.new(DLL_NAME, 'GetGameHWND', 'v', 'l')
- @@change_size = Win32API.new(DLL_NAME, 'ChangeSize', 'n i i', 'i')
- module_function
- # PNG形式で保存
- def png_save(bitmap,file_name,compression_level,filter)
- return @@png_save.call(file_name, bitmap.object_id, compression_level, filter)
- end
- # ぼかし効果
- def blur(bitmap, r = 1)
- return @@blur.call(bitmap.object_id, r)
- end
-
- # カラーバランス変更?
- def change_tone(bitmap, red = 0, green = 0, blue = 0, simplify = 1)
- return @@change_tone.call(bitmap.object_id, red, green, blue, simplify)
- end
- # マスクによる画像の切り抜き(アルファとの乗算)
- def clip_mask(g_bitmap, m_bitmap, x=0, y=0, outer=0)
- return @@clip_mask.call(g_bitmap.object_id, m_bitmap.object_id, x, y, outer)
- end
- # 色の反転
- def invert(bitmap)
- return @@invert.call(bitmap.object_id)
- end
- # モザイク効果
- def mosaic(bitmap, msw=5, msh=5)
- return self.mosaic_rect(bitmap, bitmap.rect, msw, msh)
- end
- # モザイク効果(範囲指定)
- def mosaic_rect(bitmap, rect, msw=5, msh=5)
- return @@mosaic.call(bitmap.object_id,
- rect.x, rect.y, rect.width, rect.height, msw, msh)
- end
- # ビットマップデータのアドレスを取得
- def address(bitmap)
- return @@address.call(bitmap.object_id)
- end
-
- # ビットマップのバイナリデータを取得
- def get_pixel_data(bitmap)
- buffer = "bgra" * bitmap.width * bitmap.height
- @@get_pixel_data.call(bitmap.object_id, buffer, buffer.size)
- return buffer
- end
-
- # ビットマップのバイナリデータを置き換え
- def set_pixel_data(bitmap, data)
- return @@set_pixel_data.call(bitmap.object_id, data, data.size)
- end
-
- def blend_blt(dest_bmp, x, y, src_bmp, rect, blend_type=0, opacity=255)
- @@blend_blt.call(dest_bmp.object_id, x, y, src_bmp.object_id,
- rect.x, rect.y, rect.width, rect.height,
- blend_type, opacity)
- end
- # ビットマップのサイズを変更(危険)
- def change_size(bitmap, new_width, new_height)
- return -1 if (new_width <=0 or new_height <= 0)
- result = @@change_size.call(bitmap.object_id, new_width, new_height)
- if result == ERROR_ALLOCATE_FAILED
- raise("tktk_bitmap:ERROR ALLOCATE FAILED")
- end
- return result
- end
-
- end
- class Font
- def marshal_dump;end
- def marshal_load(obj);end
- end
- class Bitmap
- # PNG圧縮用フィルタ
- PNG_NO_FILTERS = 0x00
- PNG_FILTER_NONE = 0x08
- PNG_FILTER_SUB = 0x10
- PNG_FILTER_UP = 0x20
- PNG_FILTER_AVG = 0x40
- PNG_FILTER_PAETH = 0x80
- PNG_ALL_FILTERS = (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP |
- PNG_FILTER_AVG | PNG_FILTER_PAETH)
- # Marshal_dump
- def _dump(limit)
- return "" if self.disposed?
- data = TKTK_Bitmap.get_pixel_data(self)
- [width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # ついでに圧縮
- end
-
- # Marshal_load
- def self._load(str)
- if str == ""
- b = Bitmap.new(1,1)
- b.dispose
- return b
- end
- w, h, zdata = str.unpack("LLa*"); b = new(w, h)
- TKTK_Bitmap.set_pixel_data(b, Zlib::Inflate.inflate(zdata))
- return b
- end
-
- def address
- TKTK_Bitmap.address(self)
- end
- # ぼかし効果
- def blur2(r=1)
- TKTK_Bitmap.blur(self, r)
- end
- # 色調変更
- def change_tone(red, green, blue, simplify = 1)
- TKTK_Bitmap.change_tone(self, red, green, blue, simplify)
- end
-
- # クリッピング
- def clip_mask(bitmap, x=0, y=0, outer=0)
- TKTK_Bitmap.clip_mask(self, bitmap, x, y, outer)
- end
- # 色の反転
- def invert
- TKTK_Bitmap.invert(self)
- end
- # モザイク効果
- def mosaic(msw=5, msh=5)
- TKTK_Bitmap.mosaic(self, msw, msh)
- end
- # モザイク効果(領域指定)
- def mosaic_rect(rect=self.rect, msw=5, msh=5)
- TKTK_Bitmap.mosaic_rect(self, rect, msw, msh)
- end
- # ブレンディング
- def blend_blt(x, y, src_bmp, rect, blend_type=0, opacity=255)
- return if opacity <= 0
- TKTK_Bitmap.blend_blt(self, x, y, src_bmp, rect, blend_type, opacity)
- end
- #png形式で保存
- def png_save(outp, level = 9, filter = PNG_NO_FILTERS)
- if (TKTK_Bitmap.png_save(self, outp, level, filter) != 0)
- raise("Bitmap\#png_save failed")
- end
- end
- # 大きいサイズのBitmap.newを可能に(危険)
- # width * height が大体1073741823位まで
- if TKTK_Bitmap::LARGE_BITMAP
- class << self
- unless method_defined?(:_hn_large_bm__new)
- alias :_hn_large_bm__new :new
- end
- def new(*args)
- if args.size == 2 && args[0] * args[1] >= 4194304
- new_width = args[0]
- new_height = args[1]
- # とりあえず小さなサイズで作成
- bitmap = _hn_large_bm__new(16, 16)
- TKTK_Bitmap.change_size(bitmap, new_width, new_height)
- return bitmap
- else
- _hn_large_bm__new(*args)
- end
- end
- end # Bitmap.new
- end
- end # CLASS Bitmap
复制代码
脚本②- =begin
- HN_Light version 1.0.1.0 for VX Ace
- by 半生
- http://www.tktkgame.com
- 要HN_RG_BITMAP(ver 0.1.2.1以降)
- 2012/01/08 ver 1.0.1.2
- 隊列歩行の仲間に対応
- =end
- # ----- ▽ 設定ここから ▽ -----
- module HN_Light
- # 簡略化 0:(メタボ)~2:(荒めだけど軽い)
- SIMPLIFY = 1
-
- # プレイヤーの灯りタイプに使う変数番号
- PLAYER_LIGHT_TYPE = 12
- # 仲間の灯りタイプに使う変数番号
- FOLLOWER_LIGHT_TYPE = 12
-
- # 暗闇判定に使うスイッチ
- DARK_SWITCH = 11
-
- # 灯りイベント識別用の正規表現
- REGEX_LIGHT = /@灯り(\d+)/
-
- # 灯り画像のディレクトリ
- LIGHT_IMG_DIR = "Graphics/Pictures/"
-
- # 灯りBitmap設定
- LIGHTS = [
- # [FILENAME, CELLS, ZOOM, OFFSET_Y, HUE]
- ["light5", 1, 1.5, 0, 0],
- ["light2", 1, 1.0, 0, 0],
- ["light3", 1, 0.8, 0, 0],
- ["light4", 1, 1.0, -16, 0],
- ["light5", 1, 2.0, 0, 0],
- ["light6", 1, 1.0, 0, 0],
- ["light7", 1, 3.0, -16, 0],
- ["light1", 1, 0.5, 0, 0],
- ["light6", 1, 2.0, 0, 0],
- ]
- end
- # ----- △ 設定ここまで △ -----
- module HN_Light
- # イベントへのmix-in用
- module LightEvent
- attr_reader :light_type
- def initialize
- super()
- @light_type = 0
- end
-
- def check_light
- @light_type = 0
- return if @list.nil?
- @list.each do |command|
- break if @light_type > 0
- if command.code == 108 or command.code == 408
- command.parameters.each do |line|
- if line =~ REGEX_LIGHT
- @light_type = $1.to_i
- break
- end
- end
- end
- end # END @list.each
- end
-
- end # END module LightEvent
-
-
- class Light
- attr_reader :bitmap
- attr_reader :cells
- attr_reader :width
- attr_reader :height
- attr_reader :ox
- attr_reader :oy
- def initialize(light_type, s_zoom = 1)
- light = LIGHTS[light_type - 1]
- if light.nil?
- # 本来ならここには来ないはず
- @bitmap = Bitmap.new(32, 32)
- @cels = 1
- [url=home.php?mod=space&uid=98379]@zoom[/url] = 1.0
- @oy = 16
- @ox = 16
- @width = 32
- [url=home.php?mod=space&uid=291977]@height[/url] = 32
- else
- @bitmap = Bitmap.new(LIGHT_IMG_DIR + light[0])
- @bitmap.invert()
- @cells = light[1].to_i
- @cells = 1 if (@cells < 1 or @cells > @bitmap.width)
- [url=home.php?mod=space&uid=98379]@zoom[/url] = light[2].to_f
- @zoom = 1.0 if @zoom <= 0.0
- @zoom /= s_zoom
- @width = @bitmap.width / @cells
- [url=home.php?mod=space&uid=291977]@height[/url] = @bitmap.height
- # 拡大縮小処理
- if @zoom != 1.0
- new_width = (@width * @zoom).round
- new_height = (@height * @zoom).round
- if new_width * new_height < 1
- @zoom = 1.0
- else
- @width = new_width
- @height = new_height
- new_bitmap = Bitmap.new(@width * @cells, @height)
- new_bitmap.stretch_blt(new_bitmap.rect,@bitmap, @bitmap.rect)
- @bitmap.dispose
- @bitmap = new_bitmap
- end
- end
- @ox = @width / 2
- @oy = @height / 2 - light[3].to_i / s_zoom
- # 色相変換
- if ( (hue = light[4].to_i) != 0)
- @bitmap.hue_change(hue)
- end
- end
- end # End def initialize
- # 終了処理
- def dispose
- @bitmap.dispose
- @bitmap = nil
- end
- end
- end
- class Game_Event
- include HN_Light::LightEvent
- alias :_hn_light__setup :setup_page unless method_defined?(:_hn_light__setup)
- def setup_page(new_page)
- _hn_light__setup(new_page)
- check_light()
- end
- end
- class Game_Player
- def light_type
- return $game_variables[HN_Light::PLAYER_LIGHT_TYPE]
- end
- end
- class Game_Follower
- def light_type
- return 0 if !self.visible?
- return $game_variables[HN_Light::FOLLOWER_LIGHT_TYPE]
- end
- end
- class Game_Map
- attr_reader :light_events
-
- # 灯りイベントリストの更新
- def refresh_lights
- @light_events = []
- @events.values.each do |event|
- if (event.light_type > 0)
- @light_events.push(event)
- end
- end
- end
- alias :_hn_light__setup_events :setup_events unless method_defined?(:_hn_light__setup_events)
- def setup_events
- _hn_light__setup_events()
- refresh_lights()
- end
-
- alias :_hn_light__refresh :refresh unless method_defined?(:_hn_light__refresh)
- def refresh
- _hn_light__refresh()
- refresh_lights()
- end
- end
- class Sprite_Dark < Sprite
- @@base_color = Color.new(255,255,255)
- def initialize(viewport = nil)
- super(viewport)
- @width = Graphics.width
- @height = Graphics.height
-
- case HN_Light::SIMPLIFY
- when 1
- @zoom = 2
- when 2
- @zoom = 4
- else
- @zoom = 1
- end
- @width /= @zoom
- @height /= @zoom
- self.zoom_x = @zoom.to_f
- self.zoom_y = @zoom.to_f
-
- self.bitmap = Bitmap.new(@width, @height)
- self.bitmap.fill_rect(self.bitmap.rect, @@base_color)
- self.blend_type = 2 # ブレンドタイプ(減算)
- self.z = 500
- self.visible = false
- @light_cache = {}
- end
- # 灯りを追加する
- def add_light(charactor)
- return if charactor.nil?
- light_type = charactor.light_type
- return if (light_type < 1 or light_type > HN_Light::LIGHTS.size)
- unless @light_cache.key?(light_type)
- @light_cache[light_type] = HN_Light::Light.new(light_type, @zoom)
- end
- light = @light_cache[light_type]
- # 画面外の場合は何もしない
- if @zoom == 1
- return if (charactor.screen_x < 0 - light.width + light.ox)
- return if (charactor.screen_x > @width + light.ox)
- return if (charactor.screen_y < 0 - light.height + light.oy)
- return if (charactor.screen_y > @height + light.oy)
- else
- return if (charactor.screen_x < 0 - (light.width + light.ox) * @zoom)
- return if (charactor.screen_x > (@width + light.ox) * @zoom)
- return if (charactor.screen_y < 0 - (light.height + light.oy) * @zoom)
- return if (charactor.screen_y > (@height + light.oy) * @zoom)
- end
- # アニメーション判定
- if light.cells > 1
- index = (Graphics.frame_count / 4) % light.cells
- rect = Rect.new(index * light.width , 0, light.width, light.height)
- else
- rect = light.bitmap.rect
- end
- if @zoom != 1
- p_x = charactor.screen_x / @zoom - light.ox
- p_y = (charactor.screen_y - 16) / @zoom - light.oy
- else
- p_x = charactor.screen_x - light.ox
- p_y = charactor.screen_y - 16 - light.oy
- end
-
- # 乗算合成(3)
- self.bitmap.blend_blt(p_x, p_y, light.bitmap, rect, 3)
- end
-
- def refresh
- self.bitmap.fill_rect(self.bitmap.rect, @@base_color)
- $game_map.light_events.each do |event|
- next if HN_Light::LIGHTS[event.light_type - 1].nil?
- add_light(event)
- end
- add_light($game_player)
- $game_player.followers.each{|f| add_light(f)}
- end
-
- # 更新
- def update
- super
- refresh()
- end
-
- #--------------------------------------------------------------------------
- # ● 解放
- #--------------------------------------------------------------------------
- def dispose
- self.bitmap.dispose
- @light_cache.values.each do |light|
- light.dispose
- end
- super
- end
- end
- class Spriteset_Map
- # 暗闇スプライトの作成
- def create_dark
- @dark_sprite = Sprite_Dark.new(@viewport1)
- end
- # 暗闇スプライトの更新
- def update_dark
- if (@dark_sprite.visible = $game_switches[HN_Light::DARK_SWITCH])
- @dark_sprite.update
- end
- end
- # 暗闇スプライトの破棄
- def dispose_dark
- @dark_sprite.dispose
- end
-
- # 初期化
- alias :_dark__initialize :initialize unless private_method_defined?(:_dark__initialize)
- def initialize
- _dark__initialize()
- create_dark()
- update_dark()
- end
-
- # 更新
- alias :_dark__update :update unless method_defined?(:_dark__update)
- def update
- _dark__update()
- update_dark() if !@dark_sprite.nil? and !@dark_sprite.disposed?
- end
-
- # 終了処理
- alias :_dark__dispose :dispose unless method_defined?(:_dark__dispose)
- def dispose
- dispose_dark()
- _dark__dispose()
- end
- end
复制代码
脚本③- =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
复制代码- =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
复制代码
|
评分
-
查看全部评分
|