Pygame Zero④ アニメーションとサウンド
アニメーションとサウンド
スプライトをアニメーションさせるには,前回のようにupdate()
の中で座標を更新する方法に加え,Animationクラスを利用する方法があります.
Animationクラスでは,直線的な動きに加え,速度の変化や,揺れる動きなどを簡単に表現することが可能です.
また,Soundクラスや,Musicクラスを利用すると,ゲームに効果音やBGMを再生することが可能です.
これらのクラスを活用して,ゲームの雰囲気を高めましょう.
準備
Muエディタを起動したら,Pygame Zero モードを選択しましょう. 保存用のフォルダを「chapter11」という名前で作成し,ソースファイルを「game.py」という名前でフォルダ内に保存します. また,ゲームを表示するためのウィンドウを作成します. ウィンドウの幅は640px,高さは480px,背景色は白色に設定します.
WIDTH = 640
HEIGHT = 480
def draw():
screen.fill("white")
アニメーション
KENNYのAlien UFO Packに収録されている UFOの画像ufo1.pngとufo2.pngをダウンロードして,imagesフォルダにコピーしてください.
Animationクラス
Animationクラスを利用したアニメーションを実装しましょう.
Animationクラスのオブジェクトはanimate()
で生成します.
animate()
の引数として,対象のActorクラスのオブジェクト(ufo
),
アニメーションで移動する目的の座標(pos=(640, 240)
),
アニメーションのタイプ(tween="linear"
),
アニメーションの開始から終了までの秒数(duration=3
)を指定します.
ここでは,スクリーンの左から右に向かって,3秒間かけて直線上に移動します.
また,アニメーションの終了後に呼び出す関数を指定する引数on_finished
が用意されていますが,
正常な動作を確認できなかったので注意しましょう(Version 1.2.1で確認).
# スプライトの生成
ufo = Actor("ufo1", midleft=(0, 240))
# 座標(640, 240)に向かって線形に3秒間移動
animate(ufo, pos=(640, 240), tween="linear", duration=3)
def draw():
screen.fill("white")
ufo.draw()
アニメーションのタイプには,linear
を含めて,10種類が用意されています.
accelerate
は,ゆっくりとした速度から,だんだん速度が上昇するアニメーションです.
animate(ufo, pos=(640, 240), tween="accelerate", duration=3)
bounce_start
は,アニメーションの最初に,跳ねるような動きをするアニメーションです.
animate(ufo, pos=(640, 240), tween="bounce_start", duration=3)
例題1
Animationクラスのドキュメントを参考に,他のアニメーションタイプを試してみてください.
Clockクラス
Clockクラスを利用することで,一定時間ごとに特定の関数を呼び出すことができます.
Clockクラスには,一定時間後に指定した関数を実行するschedule()
と,一定の時間間隔で指定した関数を繰り返し実行するschedule_interval()
が用意されています.
ここでは,後者のschedule_interval()
を利用して,UFOを一定の時間間隔で表示します.
引数として,対象の関数(makeUFO
),秒単位の時間間隔(1
)を指定しています.
これにより,1秒間隔でmakeUFO()
が実行され,ランダムな位置にUFOが表示されます.
複数のUFOを生成するため,リストufo_list
を宣言し,生成したUFOをリストに追加しています.
from random import *
ufo_list = []
def makeUFO():
# 乱数でUFOの初期座標を設定
x = randint(0, 640)
y = randint(0, 480)
ufo = Actor("ufo1", center=(x, y))
# 乱数でUFOの目的座標を設定
x2 = randint(0, 640)
y2 = randint(0, 480)
animate(ufo, pos=(x2, y2), tween="linear", duration=3)
# UFOをリストに追加
ufo_list.append(ufo)
# 1秒ごとにmakeUFO()を呼び出す
clock.schedule_interval(makeUFO, 1)
def draw():
screen.fill("white")
for ufo in ufo_list:
ufo.draw()
def update():
if len(ufo_list) == 10:
clock.unschedule(makeUFO)
サウンド
Soundクラス
Soundクラスを利用すると効果音を再生することができます. PygameZeroでは,.wav と .ogg のサウンド・ファイルを再生することができます.
KENNYでは,画像ファイルだけではなく,サウンド・ファイルも提供されています. ここでは,Interface Soundsをダウンロードして利用しましょう. ダウンロードしたサウンド・ファイル(.ogg)を,新規作成した soundsフォルダ を作成し,コピーして配置します.
ここでは,UFOが表示されたとき,open_001.ogg
を効果音として再生します.
効果音を再生するには,sounds.open_001.play()
と記述します.
このとき,拡張子の.ogg
は不要であることに注意してください.
def makeUFO():
# 乱数でUFOの初期座標を設定
x = randint(0, 640)
y = randint(0, 480)
ufo = Actor("ufo1", center=(x, y))
# 乱数でUFOの目的座標を設定
x2 = randint(0, 640)
y2 = randint(0, 480)
animate(ufo, pos=(x2, y2), tween="linear", duration=3)
# UFOをリストに追加
ufo_list.append(ufo)
# サウンド(open_001.ogg)を再生
sounds.open_001.play()
UFOをマウスでクリックしたとき,scratch_001.ogg
を効果音として再生し,画像をufo2.png
に変更します.
前回説明したように,マウスのイベント処理は,on_mouse_down(pos)
を利用します.
また,UFOとマウスのクリック位置の重なり(衝突)をcollidepoint()
で検出しています.
def on_mouse_down(pos):
for ufo in ufo_list:
if ufo.collidepoint(pos):
# サウンド(scratch_001.ogg)を再生
sounds.scratch_001.play()
# 画像(ufo2.png)に変更
ufo.image = "ufo2"
Musicクラス
Musicクラスを利用するとBGMを再生することができます. Soundクラスで再生される効果音は,同時に複数のサウンドを再生することが可能ですが,Musicクラスで再生されるBGMは,常に一つのサウンドしか再生できません. また,Musicクラスで再生されたサウンドは,デフォルトでリピート再生されます.
ここでは,魔王魂で提供されているBGM用のサウンド・ファイルを利用しましょう.
同サイトから,サイバー01をダウンロードして利用しましょう.
ダウンロードしたサウンド・ファイル(.ogg)をbgm.ogg
にリネームし,新規作成した musicフォルダ を作成し,コピーして配置します.
BGMを再生するには,music.play("bgm")
と記述します.
Soundクラスと同様に,拡張子の.ogg
は不要であることに注意してください.
music.play("bgm")
例題2
効果音やBGMを自由に変更してみてください.
課題
次の課題に取組んでください.
- 全てのUFOをクリックしたら「FINISH」と表示してください
- 全てのUFOをクリックしたら,BGMの再生を
music.stop()
でストップし,サウンド・ファイル(confirmation_004.ogg
)を再生してください
課題を完成させたらスクリプトを保存し,chapter11フォルダをZIPで圧縮してから,chapter11.zipという名前でファイルを提出してください.