#◆◇◆◇◆ BGS自動演奏スクリプトVX ver 1.05 ◇◆◇◆◇ # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ■ 更新履歴 ○ ver 1.05(2009/02/01) BGS自動演奏の無効機能を追加。 ○ ver 1.04(2009/02/01) 場所移動が正常に動作しないミスを修正。 ○ ver 1.03(2008/07/13) 前回更新のミスを修正。 ○ ver 1.02(2008/07/13) 環境イベントでなくてもBGSがなるミスを修正。 ○ ver 1.01(2008/07/01) 無効なイベントで落ちるミスを修正。 ■ 説明 マップ上にあるイベントが存在する場合、 そのイベントとの距離に応じて、 音量を自動で変えるBGS演奏機能を実装するスクリプトです。 イベントに近づけば音も大きくなり、 逆に遠ざかれば音も小さくなります。 イベントごとに音の届く距離、演奏するBGSを設定できます。 滝や噴水、砂浜やソナーなどの演出に使えます。 複数の候補イベントがある場合は最も近いイベントのものを参照します。 設定にはイベントの名前に 環境 の文字を含ませてください。 (環境噴水 など) ただし、イベントコマンドなどで 何らかのBGSが演奏されている場合はそちらが優先されます。 設定はソース内部で行ってください。 ■ BGS自動演奏の無効機能 環境イベントの"ページの「最初」の実行内容"に「注釈」を置くことで、 その環境イベントを無効化できます。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # BGS自動演奏スクリプトを有効化 ( true で有効 / false で無効 ) RGSS["Auto_BGS"] = true end # BGS自動演奏スクリプトが有効な場合に以降の処理を実行する if MINTO::RGSS["Auto_BGS"] == true then #============================================================================== # ☆ Auto_BGS_Pass #------------------------------------------------------------------------------ # 指定ポイントからプレイヤーの相対距離を算出して、 # 自動的に指定BGSの音量を変化させるモジュールです。 #============================================================================== module Auto_BGS_Pass #-------------------------------------------------------------------------- # ● データの設定 # name : イベント名 # id : イベントID #-------------------------------------------------------------------------- def self.set_data(name, id) # イベント名に応じて分岐 case name when "環境噴水" then # イベントID(変更しない), 音の届く距離, 演奏するBGS名 # 1マスの距離が32です。 @data = [id, 640, "River"] when "環境浜" then # イベントID(変更しない), 音の届く距離, 演奏するBGS名 # 1マスの距離が32です。 @data = [id, 3000, "Sea"] end end #-------------------------------------------------------------------------- # ● データの取得 #-------------------------------------------------------------------------- def self.data return @data end #-------------------------------------------------------------------------- # ● データのクリア #-------------------------------------------------------------------------- def self.clear @data = nil @x = nil @y = nil end #-------------------------------------------------------------------------- # ● 最終相対距離の取得 #-------------------------------------------------------------------------- def self.last_distance return @last_distance end #-------------------------------------------------------------------------- # ● 最終相対距離の変更 # n : 相対距離 #-------------------------------------------------------------------------- def self.last_distance=(n) @last_distance = n end #-------------------------------------------------------------------------- # ● 相対距離算定 # id : イベントID #-------------------------------------------------------------------------- def self.distance(id) # イベントを取得 @event = $game_map.events[id] # 距離の絶対値を取得 distance_x = (@event.screen_x - $game_player.screen_x).abs distance_y = (@event.screen_y - $game_player.screen_y).abs # 互いの距離から相対距離を返す return distance_x + distance_y end #-------------------------------------------------------------------------- # ● 音量の取得 # data : イベントデータ #-------------------------------------------------------------------------- def self.get_volume(data) # 相対距離より音量を算出 return (data[1] - self.distance(data[0])).rate(data[1]) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def self.update # イベントなどで何らかのBGSを演奏中の場合 if RPG::BGS.last.name != "" then # メソッドを返す return end # 無効なデータの場合 if @data == nil then # メソッドを返す return end # 無効なイベントの場合 if $game_map.events[@data[0]] == nil then # データをクリア self.clear # メソッドを返す return end # 環境イベントでない場合 if $game_map.events[@data[0]].bgs_event? == false then # データをクリア self.clear # BGSを解放 Audio.bgs_stop # メソッドを返す return end # プレイヤーの位置を取得 x = $game_player.x y = $game_player.y # 動いていない場合 if @x == x and @y == y then # メソッドを返す return end # 最終座標を更新 @x = x @y = y # 相対距離より音量を算出 volume = [self.get_volume(@data), 0].max # BGSを演奏 Audio.bgs_play("Audio/BGS/#{@data[2]}", volume) # BGSが更新された場合 if @last_bgs != @data[2] then # 最終BGS名を更新 @last_bgs = @data[2].dup # 極端な処理落ちを防止する Graphics.frame_reset end end end #============================================================================== # ☆ MINTO_Scene_Map_02 #------------------------------------------------------------------------------ # マップ画面を強化するモジュールです。 #============================================================================== module MINTO_Scene_Map_02 #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start # BGSモジュールのデータをクリア Auto_BGS_Pass.clear # 継承先の処理に移行 super end #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- def terminate # BGSモジュールのデータをクリア Auto_BGS_Pass.clear # BGS設定中でない場合 if RPG::BGS.last.name == "" then # BGSを解放 Audio.bgs_stop end # 継承先の処理に移行 super end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # BGSモジュールを更新 Auto_BGS_Pass.update # 継承先の処理に移行 super end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ● フレーム更新 # 使用エイリアス : update_MINTO_Auto_BGS #-------------------------------------------------------------------------- alias :update_MINTO_Auto_BGS :update def update # 最終相対距離をクリア Auto_BGS_Pass.last_distance = nil # 元の処理を実行 update_MINTO_Auto_BGS end end #============================================================================== # ■ Game_Event #------------------------------------------------------------------------------ #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理 # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。 #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :event # イベント #-------------------------------------------------------------------------- # ● フレーム更新 # 使用エイリアス : update_MINTO_Auto_BGS #-------------------------------------------------------------------------- alias :update_MINTO_Auto_BGS :update def update # イベント名に 環境 が含まれる場合 if @event.name.include?("環境") == true then # イベントとの相対距離を取得 distance = Auto_BGS_Pass.distance(@event.id) # 最終相対距離が無効な場合 if Auto_BGS_Pass.last_distance == nil then # 最終相対距離を更新 Auto_BGS_Pass.last_distance = distance # 自動演奏データを変更 Auto_BGS_Pass.set_data(@event.name, @event.id) # 最終相対距離よりも近づいた場合 elsif distance <= Auto_BGS_Pass.last_distance then # 最終相対距離を更新 Auto_BGS_Pass.last_distance = distance # 自動演奏データを変更 Auto_BGS_Pass.set_data(@event.name, @event.id) end end # 元の処理を実行 update_MINTO_Auto_BGS end #-------------------------------------------------------------------------- # ● 環境イベント判定 #-------------------------------------------------------------------------- def bgs_event? self.event.name.include?("環境") and @page != nil and @page.list != nil and @page.list[0].code != 108 end end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ● 場所移動 # 使用エイリアス : command_201_MINTO_Auto_BGS #-------------------------------------------------------------------------- alias :command_201_MINTO_Auto_BGS :command_201 def command_201 # BGSモジュールのデータをクリア Auto_BGS_Pass.clear # BGS設定中でない場合 if RPG::BGS.last.name == "" then # BGSを解放 Audio.bgs_stop end # 元の処理を実行 return command_201_MINTO_Auto_BGS end end #============================================================================== # ■ Scene_Map #------------------------------------------------------------------------------ #  マップ画面の処理を行うクラスです。 #============================================================================== class Scene_Map < Scene_Base #-------------------------------------------------------------------------- # ● システムインクルード #-------------------------------------------------------------------------- include(MINTO_Scene_Map_02) end end