人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

効果音を鳴らす

マップ間移動するときにザッザッザッと鳴るようにしてみます。いずれは宝箱を開けるときにガチャ、扉を開けるときにバタンと鳴るようにしますが今回はザッザッザッだけです。効果音はザ・マッチメイカァズさんからお借りしています。効果音入るとリアルになりますね。

pyrpg20.zip
f:id:aidiary:20100807181937p:plain

効果音設定ファイルのロード

効果音は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()を呼び出せば音が鳴ります。特に難しいことないですね。