【初心者向け】KivyによるWindowsアプリ作成35 効果音を鳴らす処理の追加

今回の記事では、ゲーム上で行われる様々なアクションの都度効果音が鳴るようにし、ゲームとしての完成度を高めていきたいと思います。

なお、今回でタイピングゲームは完成となります。

コード全量については、GitHub上のファイルをご参照下さい。

<スポンサーリンク>

事前準備

音を鳴らすアクションの特定

まず始めに、ゲーム上、どのアクション実行時に音を鳴らすかを特定しておきます。

今回、そのアクションは下表の通りにしたいと思いますが、適宜変更して頂いて構いません。

No. 音を鳴らすアクション 補足
1 画面遷移 以下の5箇所
・タイトル画面でボタンが押された時(2箇所)
・ゲーム画面でto Titleボタンが押された時
・ゲームオーバーポップアップでto Titleボタンが押された時
・難易度調整画面でto Titleボタンが押された時
2 ゲーム開始 ゲーム開始ポップアップでYesボタンが押された時
3 文字表示
4 正解タイプ
5 ミスタイプ
6 ゲームオーバー
7 難易度選択

音声データの取得

音を鳴らすアクションが特定できたら、それらのイメージに合致する音声データを取得します。

ファイルは、フリーのものがWeb上に多々ありますが、今回は効果音ラボさんからファイルを取得しました。

参考まで、アクション毎に私が取得したファイルを列挙しますが、サイト上で各音声データを聞くことができますので、実際にサイト上で音を聞きながらご自身のイメージに合うものをダウンロードされるのが良いと思います。

No. 音を鳴らすアクション ファイル名
1 画面遷移  enemy-advent1.mp3
2 ゲーム開始  laser1.mp3
3 文字表示  slap1.mp3
4 正解タイプ  shot-struck1.mp3
5 ミスタイプ  cancel6.mp3
6 ゲームオーバー  bomb2.mp3
7 難易度選択  knife-throw1.mp3

ファイルをダウンロードしましたら、main.pyが保存されているフォルダに「sound」というフォルダを作成し、その中に入れておいて下さい。

なお、サイトの利用規約上、ファイルの無償での再配布が禁じられているため、GitHubにアップしたファイル一式内に音声データは含めておりません。予めご了承下さい。

実装

今回は、処理のフローという観点からは特段複雑なポイントはありませんので、実装方針の検討を省いて、早速実装に入っていきたいと思います。

なお、実装は、

①音声データの読み込み

②音を鳴らす処理の追加

という2段階で行います。

①音声データの読み込み

まずは、音声データを読み込むために必要なモジュールをインポートします。

・・・
from kivy.uix.widget import Widget
from kivy.core.audio import SoundLoader #追加
from kivy.resources import resource_add_path #追加

次に、取得した音声データにプログラムから(フォルダ名+ファイル名ではなく)ファイル名のみでアクセスできるよう、先ほど作成したsoundフォルダをリソースパスに加えます。

・・・
difficulty = "easy"
sm = ScreenManager()

resource_add_path("./sound") #追加

さらに、プログラム中の処理から音声データに簡単にアクセスできるよう、各音声データを含むインスタンスを生成し、それらを適当な変数に格納しておきます。

インスタンスの生成は、先ほどインポートしたSoundLoaderクラスのloadメソッドを使って行うことができます。

・・・
resource_add_path("./sound")
transitSound = SoundLoader.load("enemy-advent1.mp3") #ここから追加
startSound = SoundLoader.load("laser1.mp3")
appearSound = SoundLoader.load("slap1.mp3")
vanishSound = SoundLoader.load("shot-struck1.mp3")
missSound = SoundLoader.load("cancel6.mp3")
endSound = SoundLoader.load("bomb2.mp3")
selectSound = SoundLoader.load("knife-throw1.mp3") #ここまで追加

②音を鳴らす処理の追加

続いて、事前準備の項に記載したアクション毎に、音を鳴らす処理を追加していきます。

音を鳴らすためには、先ほど生成したインスタンスのplayメソッドを使います。

音声データインスタンス.play()

これを使って、アクション毎に、音を鳴らす処理を追加しましょう。

No.1:画面遷移

class TitleScreen(Screen):
    def startButtonClicked(self):
        ・・・
        readyView.open()
        transitSound.play() #追加

    ・・・

    def difficultyButtonClicked(self):
        ・・・
        sm.current = "difficulty"
        transitSound.play() #追加
class GameScreen(Screen):
    ・・・
    def returnButtonClicked(self):
        ・・・
        sm.current = "title"
        transitSound.play() #追加
class GameOverView(ModalView):
    def returnButtonClicked(self):
        ・・・
        self.dismiss()
        transitSound.play() #追加
class DifficultyScreen(Screen):
    def returnButtonClicked(self):
        ・・・
        sm.current = "title"
        transitSound.play() #追加

No.2:ゲーム開始

class ReadyView(ModalView):
    def yesButtonClicked(self):
        ・・・
        self.dismiss()
        startSound.play() #追加

No.3:文字表示

class GameScreen(Screen):
    ・・・
    def update(self, dt):
        ・・・
        if self.counter >= self.counterLimit:
            ・・・
            self.targets.append(target)
            self.counter = 0
            appearSound.play() #追加

No.4:正解タイプ

class GameScreen(Screen):
    ・・・
    def keyboardDown(self, keyboard, keycode, text, modifiers):
        ・・・
        for target in self.targets:
            if target.text == text:
                ・・・
                missFlag = False
                vanishSound.play() #追加

なお、keyboardDownメソッド内には、スコアの減算処理を行う箇所が上記以外にも2箇所あると思いますが、そのいずれにもvanishSound.play()を追記しておいて下さい。

No.5:ミスタイプ

class GameScreen(Screen):
    ・・・
    def keyboardDown(self, keyboard, keycode, text, modifiers):
        ・・・
        if len(modifiers) == 0:
            ・・・
            else:
                self.score -= 10
                missSound.play() #追加
                return

No.6:ゲームオーバー

class GameScreen(Screen):
    ・・・
    def update(self, dt):
        ・・・
        if len(self.targets) >= 20:
            ・・・
            self.end()
            endSound.play() #追加

No.7:難易度選択

class DifficultyScreen(Screen):
    ・・・
    def difficultySelected(self, btn):
        ・・・
        for item in ["easy", "normal", "hard"]:
            ・・・
        selectSound.play() #追加

実装は以上です。コードの修正範囲は広いものの、難しい点はそれほど無かったのではないでしょうか。

テスト実行

それではプログラムを実行してみて、期待した通りに音が鳴るか確認してみましょう。

実際にゲームを進めながら音を聞いてみると、しっくりこないよう感じるものがあるかもしれません。

鳴らす音を変えることにそれほど手間はかかりませんので、気に入った音が見つかるまで、音声データ探しとプログラムの修正を繰り返して頂ければと思います。

終わりに

ずいぶんと長くなってしまいましたが、今回を以て、一旦Kivyに関する紹介を終えたいと思います。

一連の記事で、kivyの使い方を網羅的に紹介できたわけではもちろんありませんが、どのようにKivyを用いてプログラムを作っていくのか、そのとっかかり程度はつかんで頂けたのではないかと思っています。

Kivyに関する情報源は、Webにたくさんありますので、作りたいアプリが思いつきましたら、それら情報源と併せて本ブログを活用頂けると幸甚です。

<スポンサーリンク>

シェアする

フォローする