Pygame Zero④ アニメーションとサウンド

Image from Gyazo

アニメーションとサウンド

スプライトをアニメーションさせるには,前回のようにupdate()の中で座標を更新する方法に加え,Animationクラスを利用する方法があります. Animationクラスでは,直線的な動きに加え,速度の変化や,揺れる動きなどを簡単に表現することが可能です. また,Soundクラスや,Musicクラスを利用すると,ゲームに効果音やBGMを再生することが可能です. これらのクラスを活用して,ゲームの雰囲気を高めましょう.

準備

Muエディタを起動したら,Pygame Zero モードを選択しましょう. 保存用のフォルダを「chapter11」という名前で作成し,ソースファイルを「game.py」という名前でフォルダ内に保存します. また,ゲームを表示するためのウィンドウを作成します. ウィンドウの幅は640px,高さは480px,背景色は白色に設定します.

WIDTH = 640
HEIGHT = 480

def draw():
	screen.fill("white")

アニメーション

KENNYAlien UFO Packに収録されている UFOの画像ufo1.pngufo2.pngをダウンロードして,imagesフォルダにコピーしてください.

Image from Gyazo

Image from Gyazo

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()

Image from Gyazo

アニメーションのタイプには,linearを含めて,10種類が用意されています. accelerateは,ゆっくりとした速度から,だんだん速度が上昇するアニメーションです.

animate(ufo, pos=(640, 240), tween="accelerate", duration=3)

Image from Gyazo

bounce_startは,アニメーションの最初に,跳ねるような動きをするアニメーションです.

animate(ufo, pos=(640, 240), tween="bounce_start", duration=3)

Image from Gyazo

例題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)

Image from Gyazo

サウンド

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"

Image from Gyazo

Musicクラス

Musicクラスを利用するとBGMを再生することができます. Soundクラスで再生される効果音は,同時に複数のサウンドを再生することが可能ですが,Musicクラスで再生されるBGMは,常に一つのサウンドしか再生できません. また,Musicクラスで再生されたサウンドは,デフォルトでリピート再生されます.

ここでは,魔王魂で提供されているBGM用のサウンド・ファイルを利用しましょう. 同サイトから,サイバー01をダウンロードして利用しましょう. ダウンロードしたサウンド・ファイル(.ogg)をbgm.oggにリネームし,新規作成した musicフォルダ を作成し,コピーして配置します.

BGMを再生するには,music.play("bgm")と記述します. Soundクラスと同様に,拡張子の.oggは不要であることに注意してください.

music.play("bgm")

例題2

効果音やBGMを自由に変更してみてください.

課題

次の課題に取組んでください.

Image from Gyazo

課題を完成させたらスクリプトを保存し,chapter11フォルダをZIPで圧縮してから,chapter11.zipという名前でファイルを提出してください.

参考書籍

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.