いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

シューティングゲーム作成準備~! 効果音、BGMを鳴らす。

 勉強と並行してシューティングゲームでも作るかな……と、少しずつ準備しています。pythonにはpygameという2Dゲーム作成のためのモジュールがあり、ゲームを書くのに使えます。3Dは扱えないみたいですが、スプライトは使えるし、3Dっぽく見せる感じ(疑似3D)に作れば面白いでしょう。技術自体は古いかも知れませんが、大事なのは面白いかどうかです!! 相当古い話ですが、スーパーコンピュータ、Cray-1を設計したシ-モア・クレイは保守的な技術者だったそうです。実際、新しい技術を取り入れればそれだけでマシンの速さは大分上がったはずだとか。しかし彼はいつも、信頼できる、確立された技術だけを使ったのだそうです(『暗号の数理』(一松信2005講談社ブルーバックス))。……関係ないですね。話を元に戻して……スプライトに関してはこれ。
www.omoshiro-suugaku.com
効果音やBGMも必要です。しかも同時に鳴らせるようでないと困ります(BGMを流している間に爆発音が入ると音楽が止まってはダメ。あるいは爆発音も0.3秒差で鳴らし始めないとまずいこともあります)。

import os
import sys
import pygame as pg
import time
fname = '12_赤いサラファン.wav'
fname1 = '09_野ばら.wav'
path, b = os.path.split(__file__) #1
#os.sepはosによって異なるパスの区切り記号
s = path + os.sep + fname #2
print('path + os.sep + fname = ', s)
s1 = path + os.sep + fname1
print('path + os.sep + fname1 = ', s1)
pg.init() #3
dp = pg.display.set_mode((640, 480)) #4
pg.mixer.init()
sd= pg.mixer.Sound(s)
sd.play() #5
sd1= pg.mixer.Sound(s1)
sd1.play() #6
time.sleep (20) #7
sys.exit() #8

 2つのwavファイル、fname、fname1を同時に再生します。#1の__file__はPythonのシステム変数です。実行されているファイル(~~.py)がフルパスでこの変数に格納されています。os.path.split()でフォルダをpathに取り出し、#2でそのフォルダ内の音楽ファイル(wav)名をフルパスで取得します。OSによってパスの区切り記号は異なります。その区切り記号をos.sepで取得してフォルダ名とファイル名をくっつけます。ここでは2つの音源を同時に鳴らせるか実験したいので、ファイルも2つ用意しました。s、s1です。#3はpygameの初期化、#4でゲーム用の画面を作成します。この行を入れないと音楽が鳴りませんでした。ゲームのライブラリですから、まあそういうものなんでしょう……。#5で音楽を鳴らします。別の音楽を#6で鳴らして2重に聞こえるか確認します。#7はそこで指定秒数、待つためのコードです。これがないと#8でプログラムが終了してしまい、音楽は鳴りません。実際のゲームではいわゆるゲームループがあり、ゲーム中はこのループを回り続けるのでsleep()は不要です。
 実際に実行してみると……ちゃんと2重に鳴っています。素晴らしい!!

 マンガを描く人は、自分のマンガがアニメになれば「命が吹き込まれた」くらいに感じるかも知れません。シューティングゲームも近い部分があって、自分が作ったキャラクタが初めて動く、爆発する、……というときには「おお~!!」と思うものです。それなりの長さのコードになりますし、丁寧にやろうとすると結構大変ですがそれでもゲーム作りは楽しい作業です。こんな記事も前に書きました。
www.omoshiro-suugaku.com
 仕事もあるので、のんびりやっていきます。

2020年12月2日(水) 追記:
__file__は必ずしもフルパスではないそうです。
os.path.abspath(__file__))
でフルパスになるらしい。また、Jupyter Notebookでは__file__は使えないとのこと。その場合、フォルダは皆さんが適切にセットしてください。