BGS自動演奏スクリプト
◆◆ 更新履歴 ◆◆
2014/09/07 BGS自動演奏スクリプトVer1.00 公開
◆◆ スクリプト ◆◆
#============================================================================== # ■ BGS自動演奏スクリプト - RGSS3 ver 1.00(2014/09/06) #------------------------------------------------------------------------------ # マップ上の特定のイベントとの距離に応じて音量を自動で変えるBGS演奏機能を実装 # します。 #============================================================================== =begin ■ 詳細説明 マップ上にあるイベントが存在する場合、そのイベントとの距離に応じて、 音量を自動で変えるBGS演奏機能を実装します。 そのイベントに近づけば音も大きくなり、遠ざかれば音も小さくなります。 イベントごとに音の届く距離、演奏するBGSを設定できるので、 滝や噴水、砂浜やソナーなどの演出に使えます。 複数の候補イベントがある場合は最も近いイベントのものを参照します。 設定にはイベントの名前に BGS の文字を含ませてください。 ※例 BGS噴水 など ただし、イベントコマンド等で 何らかのBGSが演奏されている場合はそちらが優先されます。 ■ BGS自動演奏の無効機能 BGSイベントの"ページの「最初」の実行内容"に「注釈」を置くことで、 そのイベントのBGS自動演奏を無効化できます。注釈内容は関係ありません。 =end $MORA_imported = {} if $MORA_imported == nil $MORA_imported["Auto_BGS"] = true p "MORA BGS自動演奏スクリプト 導入確認" module MORA module Auto_BGS def self.set_data(name, id) case name #============================================================================== # ★ カスタマイズ ここから ★ #============================================================================== # ◆ データの設定 # ここで、各BGSイベントの設定を行います。 # 例に習って設定してください。 # when "イベントの名前(必ずBGSと入れること)" then # @data = [ID(変更しない), 音の届く距離, "演奏するBGS名"] ※1マスの距離は32です when "BGS暖炉" then @data = [id, 192, "Fire"] when "BGS焚火" then @data = [id, 480, "Fire"] when "BGS噴水小" then @data = [id, 512, "River"] when "BGS噴水中" then @data = [id, 544, "River"] when "BGS噴水大" then @data = [id, 576, "River"] when "BGS浜" then @data = [id, 1344, "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])) / data[1] * 100 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 end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ # マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ◎ フレーム更新 #-------------------------------------------------------------------------- alias :mora_AutoBGS_update :update def update(main = false) # 最終相対距離をクリア MORA::Auto_BGS.last_distance = nil # 元の処理を実行 mora_AutoBGS_update(main) end end #============================================================================== # ■ Game_Event #------------------------------------------------------------------------------ # イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理 # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。 #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :event # イベント #-------------------------------------------------------------------------- # ◎ フレーム更新 #-------------------------------------------------------------------------- alias :mora_AutoBGS_update :update def update # イベント名に BGS が含まれる場合 if @event.name.include?("BGS") == true then # イベントとの相対距離を取得 distance = MORA::Auto_BGS.distance(@event.id) # 最終相対距離が無効な場合 if MORA::Auto_BGS.last_distance == nil then # 最終相対距離を更新 MORA::Auto_BGS.last_distance = distance # 自動演奏データを変更 MORA::Auto_BGS.set_data(@event.name, @event.id) # 最終相対距離よりも近づいた場合 elsif distance <= MORA::Auto_BGS.last_distance then # 最終相対距離を更新 MORA::Auto_BGS.last_distance = distance # 自動演奏データを変更 MORA::Auto_BGS.set_data(@event.name, @event.id) end end # 元の処理を実行 mora_AutoBGS_update end #-------------------------------------------------------------------------- # ● 自動演奏イベント判定 #-------------------------------------------------------------------------- def bgs_event? self.event.name.include?("BGS") 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 #-------------------------------------------------------------------------- # ◎ 場所移動 #-------------------------------------------------------------------------- alias :mora_AutoBGS_command_201 :command_201 def command_201 # BGSモジュールのデータをクリア MORA::Auto_BGS.clear # BGS設定中でない場合 if RPG::BGS.last.name == "" then # BGSを解放 Audio.bgs_stop end # 元の処理を実行 mora_AutoBGS_command_201 end end #============================================================================== # ■ Scene_Map #------------------------------------------------------------------------------ # マップ画面の処理を行うクラスです。 #============================================================================== class Scene_Map < Scene_Base #-------------------------------------------------------------------------- # ◎ 開始処理 #-------------------------------------------------------------------------- alias mora_start start def start # BGSモジュールのデータをクリア MORA::Auto_BGS.clear # 元の処理を実行 mora_start end #-------------------------------------------------------------------------- # ◎ 終了処理 #-------------------------------------------------------------------------- alias mora_terminate terminate def terminate # BGSモジュールのデータをクリア MORA::Auto_BGS.clear # BGS設定中でない場合 if RPG::BGS.last.name == "" # BGSを解放 Audio.bgs_stop end # 元の処理を実行 return mora_terminate end #-------------------------------------------------------------------------- # ◎ フレーム更新 #-------------------------------------------------------------------------- alias mora_update update def update # BGSモジュールを更新 MORA::Auto_BGS.update # 元の処理を実行 mora_update end end
ブログへ戻る