効果音を鳴らす
マップ間移動するときにザッザッザッと鳴るようにしてみます。いずれは宝箱を開けるときにガチャ、扉を開けるときにバタンと鳴るようにしますが今回はザッザッザッだけです。効果音はザ・マッチメイカァズさんからお借りしています。効果音入るとリアルになりますね。
効果音設定ファイルのロード
効果音はBGMと違ってしょっちゅういろいろな場面で鳴らす必要があるためあらかじめすべてメモリにロードしておくことにします。どのような効果音を使うかは効果音設定ファイルに記述しておきます。data内のsound.datがそれです。
step,step.wav
今回はマップ間移動するときのザッザッザッという音しか使いません。step.wavという効果音ファイルをstepという名前で登録しておきます。効果音の名前は必ずしもファイル名と同じする必要はありません(同じにするなら逆に効果音名はいらないですが)。効果音設定ファイルに登録した効果音だけがロードされ、ゲーム中で使うことができます。効果音設定ファイルを読み込んでいるのはmain()のload_sounds()です。
sounds = {} # サウンド # サウンドをロード load_sounds("data", "sound.dat") def load_sounds(dir, file): """サウンドをロードしてsoundsに格納""" file = os.path.join(dir, file) fp = open(file, "r") for line in fp: line = line.rstrip() data = line.split(",") se_name = data[0] se_file = os.path.join("se", data[1]) sounds[se_name] = pygame.mixer.Sound(se_file) fp.close()
効果音はsoundsというグローバル領域の辞書(ハッシュ)に格納します。グローバル領域にしたのはさまざまな関数やクラスで効果音を鳴らしたいからです。soundsは効果音名→Soundオブジェクトという辞書です。効果音のロードの方法はBGMと効果音の再生(2008/5/11)を参照してください。とはいえ、pygame.mixer.Sound()にファイル名を与えるだけなので簡単ですね。
効果音を鳴らす
今回はマップ間移動するときにstepという効果音を鳴らしています。マップ間移動するときに鳴らしたいのでPlayerのupdate()を更新すればいいですね。
def update(self, map): """プレイヤー状態を更新する。 mapは移動可能かの判定に必要。""" # プレイヤーの移動処理 if self.moving == True: # ピクセル移動中ならマスにきっちり収まるまで移動を続ける self.rect.move_ip(self.vx, self.vy) # マスにおさまったら移動完了 if self.rect.left % GS == 0 and self.rect.top % GS == 0: self.moving = False self.x = self.rect.left / GS self.y = self.rect.top / GS # TODO: ここに接触イベントのチェックを入れる event = map.get_event(self.x, self.y) if isinstance(event, MoveEvent): # MoveEventなら sounds["step"].play() dest_map = event.dest_map dest_x = event.dest_x dest_y = event.dest_y map.create(dest_map) # プレイヤーを移動先座標へ self.set_pos(dest_x, dest_y, DOWN) # マップに再登録 map.add_chara(self)
sounds["step"]で効果音名stepのSoundオブジェクトにアクセスできます。Soundオブジェクトのplay()を呼び出せば音が鳴ります。特に難しいことないですね。