Project1
标题:
请教声音的淡入淡出
[打印本页]
作者:
illegg
时间:
2009-5-24 04:50
标题:
请教声音的淡入淡出
如何达到这个效果呢?
1、“靠近瀑布时瀑布声越响反之越轻”
2、任何方位开始靠近瀑布都获得这个效果? [LINE]1,#dddddd[/LINE]
版务信息:本贴由楼主自主结贴~
作者:
妲己
时间:
2009-5-24 15:31
一个小脚本.转自 みんと{/cy}
#◆◇◆◇◆ BGS自動演奏スクリプトVX ver 1.04 ◇◆◇◆◇
# サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/
# by みんと
=begin
■ 更新履歴
○ 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が演奏されている場合はそちらが優先されます。
設定はソース内部で行ってください。
=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 not $game_map.events[@data[0]].event.name.include?("環境") then
# データをクリア
self.clear
# メソッドを返す
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
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
复制代码
方法:如果是喷水池之类.建立一个空白事件.把事件命名为"環境噴水"就能自动产生效果.当然如果是喷泉.记得设定事件的画面.
如果是瀑布.海滩.建立一个空白事件.命名为"環境浜".效果同上.两个事件都只要取名.不必在页面内设定任何内容.
要改动的话.改脚本的这里.可以设定事件的演奏音乐:
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
效果就是如你说的.靠近就有声音.远离就逐渐消失.
作者:
illegg
时间:
2009-5-24 21:23
添加后测试游戏显示:
行51 :发生了NameError。
uninitialiazed constant MINTO:RGSS
作者:
妲己
时间:
2009-5-24 21:40
一时疏忽了,缺了个必要的主脚本{/fd}
把下面这个脚本放到那个脚本上面即可.
#◆◇◆◇◆ マスタースクリプトVX ver 1.02 ◇◆◇◆◇
# サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/
# by みんと
=begin
更新履歴
ver 1.02
Sprite.dupのミスを修正。
ver 1.01
開発モジュールを修正、機能を強化。
使い方
全てのみんとRGSSより上に導入してください。
(基本的にシステム上部に導入してください)
これがないと全てのみんとRGSS2は動作いたしません。
=end
#==============================================================================
# ☆ MINTO
#------------------------------------------------------------------------------
# 様々なフラグを扱うメインモジュールです。
#==============================================================================
module MINTO
# VXRGSSの導入環境ハッシュを初期化
RGSS = {}
end
#==============================================================================
# ☆ MINTO_System
#------------------------------------------------------------------------------
# 様々な機能を扱うシステムモジュールです。
#==============================================================================
module MINTO_System
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
def start
@tone_rate = 0
# シーンスプライトを作成
@scene_sprite = Sprite_Base.new
# スーパークラスを実行
super
end
#--------------------------------------------------------------------------
# ● トランジション実行
#--------------------------------------------------------------------------
def perform_transition
# スーパークラスを実行
super
end
#--------------------------------------------------------------------------
# ● 開始後処理
#--------------------------------------------------------------------------
def post_start
# スーパークラスを実行
super
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
# シーンスプライトを更新
@scene_sprite.update
# スーパークラスを実行
super
end
#--------------------------------------------------------------------------
# ● 終了前処理
#--------------------------------------------------------------------------
def pre_terminate
# スーパークラスを実行
super
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
def terminate
# シーンスプライトを解放
@scene_sprite.bitmap.dispose if @scene_sprite.bitmap
@scene_sprite.dispose
@scene_sprite = nil
# スーパークラスを実行
super
end
end
# ☆ 開発用メソッド追加 ☆
#==============================================================================
# ■ Scene_Base
#------------------------------------------------------------------------------
# ゲーム中のすべてのシーンのスーパークラスです。
#==============================================================================
class Scene_Base
#--------------------------------------------------------------------------
# ● 暗転モード処理
#--------------------------------------------------------------------------
def blackout(type = 0, power = 10, max = 100, sprite = nil)
@tone_power = power
@tone_type = type
@tone_max = max
update_blackout(sprite)
end
#--------------------------------------------------------------------------
# ● フレーム更新 (暗転処理)
#--------------------------------------------------------------------------
def update_blackout(sprite)
case @tone_type
when 0
if @tone_rate != -@tone_max
@tone_rate = [@tone_rate - @tone_power, -@tone_max].max
sprite.tone.red = @tone_rate
sprite.tone.green = @tone_rate
sprite.tone.blue = @tone_rate
end
when 1
if @tone_rate != 0
@tone_rate = [@tone_rate + @tone_power, 0].min
sprite.tone.red = @tone_rate
sprite.tone.green = @tone_rate
sprite.tone.blue = @tone_rate
end
end
end
end
#==============================================================================
# ■ Sprite
#------------------------------------------------------------------------------
# スプライト表示を扱う組み込みクラスです。
#==============================================================================
class Sprite
#--------------------------------------------------------------------------
# ● 複製の作成
#--------------------------------------------------------------------------
def dup
# 各データをコピー
sprite = Sprite.new(self.viewport)
sprite.bitmap = self.bitmap.dup if self.bitmap
sprite.x = self.x
sprite.y = self.y
sprite.z = self.z
sprite.visible = self.visible
sprite.ox = self.ox
sprite.oy = self.oy
sprite.angle = self.angle
sprite.mirror = self.mirror
sprite.opacity = self.opacity
sprite.blend_type = self.blend_type
sprite.color = self.color.dup
sprite.src_rect = self.src_rect.dup
sprite.zoom_x = self.zoom_x
sprite.zoom_y = self.zoom_y
return sprite
end
#--------------------------------------------------------------------------
# ● エフェクト表示中判定
#--------------------------------------------------------------------------
def effect?
return false
end
end
#==============================================================================
# ■ Array
#------------------------------------------------------------------------------
# 配列全般を扱う組み込みクラスです。
#==============================================================================
class Array
#--------------------------------------------------------------------------
# ● 要素の交換
# a : 要素1
# b : 要素2
#--------------------------------------------------------------------------
def change(a, b)
# データを複製
data = self.dup
# 要素を交換する(self自体には変化がない)
data[a] = self[b]
data[b] = self[a]
return data
end
#--------------------------------------------------------------------------
# ● 要素の交換(破壊的)
# a : 要素1
# b : 要素2
#--------------------------------------------------------------------------
def change!(a, b)
# データを複製
data = self.dup
# 要素を交換する(selfを直接書き換える)
self[a] = data[b]
self[b] = data[a]
end
end
#==============================================================================
# ■ Numeric
#------------------------------------------------------------------------------
# 数値全般を扱う組み込みクラスです。
#==============================================================================
class Numeric
#--------------------------------------------------------------------------
# ● 範囲内から乱数を得る
# min : 求められた最小の数値
#--------------------------------------------------------------------------
def mm_rand(min)
return rand(self - min + 1) + min
end
#--------------------------------------------------------------------------
# ● 求めた数値に対するパーセンテージを返す
# order : 求められた数値
#--------------------------------------------------------------------------
def rate(order)
return 100 if order == 0
return (self * 100) / order
end
end
复制代码
[LINE]1,#dddddd[/LINE]
系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者:
illegg
时间:
2009-5-25 00:47
可以了,谢谢啊,不过这东东日文看不懂,这2个脚本还有其他作用么?
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1