#◆◇◆◇◆ ☆ 開発者用・ボイス演奏機構 ver 1・00 ◇◆◇◆◇ # ☆ 全マスタースクリプト共通スクリプト # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ※ 注意事項 このスクリプトは『RGSS開発者用』です。 使いこなすには「ある程度」のRGSS知識が要求されます。 ボイスファイルは「必ず」MP3である必要があります。 またボイスファイル名に全角文字と日本語、- は使えません。 必ず半角の英数字である必要があります。 ■ 説明 ツクールXPには音声素材を演奏する機能がなく、 SEとして強引に演奏した場合、 連続で演奏すると同じキャラの音声が重複してしまうだけでなく、 SEを終了させると全ての音声まで終わってしまい、 とても音声の演奏に向くものではありませんでした。 このスクリプトを導入すると、 バトラー(アクター、エネミー)に音声の演奏機能が導入され、 専用の演奏機構で個別に演奏されます。 連続で音声を演奏した場合でも、 自動的に「そのキャラが現在喋っている音声だけ」がカットされ、 新たな音声が演奏されます。 もちろん、BGM、BGS、ME、SEの全てになんら影響を与えません。 ■ クラス Game_Battler に以下の機能が追加されます ・ voice_play_can_use? 対象キャラが喋れる状態にあるかどうかのフラグを取得します。 喋れる状態にある場合は 真 がそうでない場合は 偽 が返ります。 制約・沈黙状態の場合は喋られないと判断します。 ・ voice_play(file_name) SEフォルダに存在する指定ファイル(MP3)を 対象キャラのボイスとして演奏します。 ツクールXP既存のサウンド演奏機能には一切干渉しません。 連続で実行した場合、対象キャラの演奏中ボイスは中断され、 新たなボイスが演奏されます。 ・ voice_close 対象キャラのボイスを強制終了させます。 ・ voice_playing? 対象キャラが実際に喋っているかどうかを取得します。 喋っている場合は 真 がそうでない場合は 偽 が返ります。 ・ voice_position 対象キャラのボイスの演奏位置を取得します(100分の1秒単位) リアルタイムで取得するので、ウィンドウを閉じていても 開いた後の演奏位置を返します。 =end #============================================================================== # ■ System_Voice #------------------------------------------------------------------------------ #  ボイスの演奏管理を行うモジュールです #============================================================================== module System_Voice #-------------------------------------------------------------------------- # ● データ初期化 #-------------------------------------------------------------------------- def self.initialize # ボイス演奏デバイスが未解放の場合 if @audio != nil then # ボイス演奏デバイスを解放 self.dispose end # ボイス演奏デバイスを設定 @audio = Win32API.new('winmm', 'mciSendStringA', %w(p p l l), 'l') end #-------------------------------------------------------------------------- # ● オーディオデータの取得 #-------------------------------------------------------------------------- def self.audio # オーディオデータを返す return @audio end #-------------------------------------------------------------------------- # ● ボイスの演奏 # device : 要求されたデバイス # voice : ボイスファイルのタイトル #-------------------------------------------------------------------------- def self.play(device, voice_title) # 再生中のボイスを停止 self.close(device) # ボイスを開くためのコマンドを設定 open = 'Open ' + voice_title + ' alias ' + device # ボイスを演奏するためのコマンドを設定 play = 'Play ' + device # ボリュームを設定 #volume_point = (100 * 100) / 10 #volume = 'Setaudio ' + device + ' volume to ' + (volume_point).to_s # 指定した音楽ファイルを開く @audio.call(open, "\0" * 256, 256, 0) # 指定した音楽ファイルを演奏する @audio.call(play, "\0" * 256, 256, 0) # ボリュームを調節 #@audio.call(volume, "\0" * 256, 256, 0) # 極端な処理落ちを防止する Graphics.frame_reset end #-------------------------------------------------------------------------- # ● ボイスファイルを閉じる # device : 要求されたデバイス #-------------------------------------------------------------------------- def self.close(device) # 要求されたデバイスのボイスを閉じる @audio.call('Close ' + device, "\0" * 256, 256, 0) end #-------------------------------------------------------------------------- # ● ボイスファイルの解放 #-------------------------------------------------------------------------- def self.dispose # 全ての演奏デバイスを閉じる @audio.call('Close all ', "\0" * 256, 256, 0) @audio = nil end #-------------------------------------------------------------------------- # ● ボイス状態の取得 # device : 要求されたデバイス #-------------------------------------------------------------------------- def self.status(device) # ボイスの演奏状態を調べる buf = "\0" * 256 @audio.call('Status ' + device + ' mode', buf, 256, 0) return buf.unpack("A*")[0] end #-------------------------------------------------------------------------- # ● ボイス演奏中フラグの取得 # device : 要求されたデバイス #-------------------------------------------------------------------------- def self.playing?(device) # ボイスを演奏中かどうかアクセスする self.status(device) == "playing" end #-------------------------------------------------------------------------- # ● ボイスの演奏位置の取得 # device : 要求されたデバイス #-------------------------------------------------------------------------- def self.position(device) # ボイスの演奏位置を調べる buf = "\0" * 256 @audio.call('Status ' + device + ' position', buf, 256, 0) return buf.unpack("A*")[0] end end #============================================================================== # ■ Game_Battler (分割定義 1) #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● ボイス演奏デバイス名の取得 #-------------------------------------------------------------------------- def voice_device # ボイス演奏デバイス名を返す return self.to_s end #-------------------------------------------------------------------------- # ● ボイス演奏可能フラグの取得 #-------------------------------------------------------------------------- def voice_play_can_use? # 沈黙状態の場合 if self.restriction == 1 # 不可フラグを返す return false end # 可能フラグを返す return true end #-------------------------------------------------------------------------- # ● ボイスの演奏 # file_name : 演奏ファイル名 #-------------------------------------------------------------------------- def voice_play(file_name) # ボイスの演奏が可能な場合 if voice_play_can_use? == true then # 演奏ボイスを取得 voice_title = "Audio/SE/#{file_name}.mp3" # ボイスを演奏する System_Voice.play(voice_device, voice_title) end end #-------------------------------------------------------------------------- # ● ボイスを閉じる #-------------------------------------------------------------------------- def voice_close # 要求されたデバイスのボイスを閉じる System_Voice.close(voice_device) end #-------------------------------------------------------------------------- # ● ボイス状態の取得 #-------------------------------------------------------------------------- def voice_status # ボイスの演奏状態を返す return System_Voice.status(voice_device) end #-------------------------------------------------------------------------- # ● ボイス演奏中フラグの取得 #-------------------------------------------------------------------------- def voice_playing? # ボイスを演奏中かどうかアクセスする System_Voice.status(voice_device) == "playing" end #-------------------------------------------------------------------------- # ● ボイスの演奏位置の取得 #-------------------------------------------------------------------------- def voice_position # ボイスの演奏位置を返す return System_Voice.position(voice_device) end end System_Voice.initialize