ゲームの技

【Pygame Zero】ゲームの技02:効果音をつけよう!

ratch2025

こんにちは!
「Pythonしよう!楽しく学べるプログラミング教室」
ラッチ先生です

ラッチ先生
ラッチ先生
スック
スック

スックです。よろしくね!

今回のプロジェクトは、こちら!

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html

ラッチ先生
ラッチ先生

基礎プログラムと 画像を入れた
「ゲームの技02 boonボーン シューティング!No.2」zipフォルダを ダウンロードしてください

pythonしよう!ゲームの技02:ボーン・敵・弾を表示する
pythonしよう!ゲームの技02:boonシューティング!No.2.zipの中身
スック
スック

この基礎プログラムは、こちらの記事で解説しています

参考記事
【Pygame Zero】スクリーンに画像を 表示させる
【Pygame Zero】スクリーンに画像を 表示させる
スポンサーリンク

スペースキーを 押すと 弾を発射する

弾に当たると 爆破アニメーションになる

敵に襲われると セリフを言う

pythonしよう!ゲームの技02:敵に襲われるとセリフを言う

効果音をつける

プログラムを 実行してみよう

ラッチ先生
ラッチ先生

今回の「boonボーン シューティング!No.2」では、
boonボーンを マウスで動かす
・ 敵が 爆破アニメーションする
・ 敵を ランダムな場所へ 配置する
boonボーン が セリフを言う
プログラムが あります

そこで、4つのモジュールを 用意しました

pythonしよう!ゲームの技02:pgzhelperモジュールを解説
pythonしよう!ゲームの技02:visualモジュールを解説
pythonしよう!ゲームの技02:randomモジュールを解説
pythonしよう!ゲームの技02:sayモジュールを解説
スック
スック

モジュールとは、
関数やプログラムが書かれているファイルのことだよ

ラッチ先生
ラッチ先生

今回は、
効果音を入れたプログラムを 作っていきます。

ポイントが 4つあります。

スック
スック

今回のプログラムに『Chisato’s Website」サイトから
・ 弾の発射音: laser_gun_09_high_powered.wav
・ 敵の爆発音: synthesizer_09_ascend_short.wav
・ 敵に捕まる音: death_explosion_03_player.wav
 3つの効果音を お借りしました。 ありがとうございます。

スック
スック

大きさや透明は、ちゃんと調節できるよ

pythonしよう!ゲームの技02:ポイント3を解説
スック
スック

それぞれの動きが わかりやすくなるよ

pythonしよう!ゲームの技02:ポイント4を解説
スック
スック

2つに 分けたよ

ラッチ先生
ラッチ先生

最初に、
boonボーンを マウスで 動かす プログラムを 作りましょう


mouseマウスオブジェクトに プロパティ「posポス」を 追加して
動いているマウスの座標を 入れます

pythonしよう!ゲームの技02:mouseオブジェクトを解説
Python
game = "play"         #1 変数gameを宣言 初期値:"play"
mouse.pos = 400, 300  #2 マウスの座標に x座標400, y座標300を 代入する
Python
def on_mouse_move(pos):  #3 動いているマウスの座標を取得して posに 代入する
    global game          #4 グローバル変数 game

    mouse.pos = pos      #5 オブジェクトマウスの座標に posの座標を 代入する
    if game == "play":   #6 もし、変数gameが "play"だったら
        boon.angle = boon.angle_to(pos) #7 boonの向きに マウスの方へ向く角度を 代入する
pythonしよう!ゲームの技02:angle_to( ) メゾットの解説
スック
スック

angleアングル_toトゥー( ) メゾットは、便利だね

ラッチ先生
ラッチ先生

つぎに、
moveムーヴ_towardsトゥーワーズ( )メゾットを 使って、
マウスの方へ 動くようにします。

pythonしよう!ゲームの技02:move_towards()メゾットの解説
Python
def boon_move():       #1 boonの動きを まとめる
    global game        #2 グローバル変数 game

    if game == "play": #3 もし 変数gameが "play"だったら 
        boon.move_towards(mouse.pos, 3) #4 boonをマウスの方へ 3pxずつ動かす 
Python
def update():          #4 更新する
    boon_move()        #5 boonを 動かす
ラッチ先生
ラッチ先生

つぎは、弾を発射させます。
弾を boonボーンの前に 表示させましょう

Python
def beam_move():       #1 弾の動きを まとめる   
    global game        #2 グローバル変数 game

    if game == "play": #3 もし 変数gameが "play"だったら
        
            beam.pos = boon.pos     #4 弾の座標に boonの座標を 代入する
            beam.angle = boon.angle #5 弾の向きに boonの向きを 代入する
            beam.move_forward(50)   #6 弾を 50px 前に出す
Python
def update(): 
    boon_move() 
    beam_move()     #7 弾を 動かす
スック
スック

おお!
boonボーンの前に弾があるぞ

ラッチ先生
ラッチ先生

変数beamビームに プロパティ『visibleビジブル』を追加して、
弾の表示・非表示のスイッチに しましょう

そして、
boonボーンの前に位置する過程を 非表示
・弾を発射 を 表示
という プログラムにします

pythonしよう!ゲームの技02:visibleプロパティの解説
Python
beam.visible = False  #1 プロパティvisubleに Falseを 代入する
Python
def on_key_down(key):       #2 押されたキーを取得して、keyに代入する
    if key == keys.SPACE:   #3 もし、スペースキーが押されたら
        beam.visible = True #4 プロパティvisibleに Trueを 代入する 
Python
def beam_move():            
    global game             

    if game == "play": 
        if not beam.visible:        #5 もし プロパティvisibleが Falseなら
            beam.pos = boon.pos     
            beam.angle = boon.angle 
            beam.move_forward(50) 
        else:                       #6 その他は(visibleがTureなら)
            beam.move_forward(20)   #7 弾は 20pxずつ 動く

            if beam.x < 0 or beam.x > WIDTH or beam.y < 0 or beam.y > HEIGHT:  #8 もし、上下左右の 端へ行ったら
                beam.visible = False  #9 プロパティvisibleに Falseを代入する
スック
スック

あれれ! 弾が ずっと表示されてるよ

ラッチ
ラッチ

おぉぉぉ…っと! 
drawドロー( ) 関数の中で、beamビーム.visibleビジブルTrueトゥルーの時だけ表示させます

Python
def draw():   
    screen.fill("white")
    boon.draw()
    enemy.draw(screen) 
    if beam.visible:   #1 もし プロパティvisibleが Trueなら
        beam.draw()    #2 弾を 表示する
スック
スック

おっ!  いいねぇ

ラッチ先生
ラッチ先生

moveムーヴ_towardsトゥーワーズ( ) メゾットを使って
敵を boonボーンの方へ 動くようにしましょう

Python
def enemy_move():      #1 敵の動きを まとめる
    global game        #2 グローバル変数 game
    if game == "play": #3 もし 変数gameが "play"なら
        enemy.angle = enemy.angle_to(boon)  #4 敵の向きに boonの方へ向く角度を代入する
        enemy.move_towards(boon, 2)  #5 boonの方へ 2pxずつ動く
Python
def update(): 
    boon_move() 
    beam_move() 
    enemy_move()  #6 敵を 動かす
スック
スック

敵が 襲ってくるね

ラッチ先生
ラッチ先生

つぎは、
enemyエネミーオブジェクトに プロパティ: hitヒットを 追加します

pythonしよう!ゲームの技02:hitプロパティの解説
Python
enemy = VisualEffect("enemy", (700, 100))  #1 VisualEffect()クラスに 変える
Python
enemy.hit = False       #2 プロパティhitに Falseを代入する
Python
def draw():
    screen.fill("white")
    boon.draw()
    enemy.draw(screen)  #3 スクリーンに つなげる
Python
def enemy_move(): 
    global game 
    if game == "play": 
        if not enemy.hit:  #4 もし プロパティhit が Falseなら
            enemy.angle = enemy.angle_to(boon) 
            enemy.move_towards(boon, 2) 
            if enemy.collide_pixel(beam) and beam.visible: #5 もし弾に当たり、弾が表示なら
                enemy.alpha_animation()  #6 透明アニメーション開始
                enemy.scale_animation(0.03, 4)  #7 拡大アニメーション開始
                enemy.hit = True  #8 プロパティhit に Trueを 代入する
        
        else:  #9 その他(プロパティhit が True)
            result = enemy.process_animation()  #10 透明+拡大アニメーションを 実行する
            if result == "finished":  #11 もし 変数resultが "finished"なら
                enemy.reset_effects() #12 敵を リセットにする 
                enemy.hit = False     #13 プロパティhit に Falseを代入する
ラッチ先生
ラッチ先生

この爆破アニメーションのスピードは、
プロパティ animationアニメーション_speedスピード で 変えられます。

pythonしよう!ゲームの技02:alpha_animation()メゾットの解説
Python
enemy.animation_speed = 3  # プロパティanimation_speed に 3を代入する
スック
スック

○ プロパティ
alphaアルファー_incrementインクリメント
animationアニメーション_speedスピード
○ メゾット
scaleスケール_animationアニメーション( 増加量, 目標倍率 )

この数値をいろいろ変えて、
自分の気に入った爆破アニメーションを 作ってね

ラッチ先生
ラッチ先生

敵が 爆破したら、
whileホワイル Trueトゥルー構文を使って
boonボーンから300px以上 離れた所で リセットさせるよ

pythonしよう!ゲームの技02:while True 構文の解説
Python
def enemy_move(): 
    global game 
    if game == "play":
        if not enemy.hit: 
                enemy.angle = enemy.angle_to(boon) 
Python
        else: 
            result = enemy.process_animation() 
            if result == "finished": 
                enemy.reset_effects() 

                while True:  #1 
                    enemy.x = random.randint(50, WIDTH-50)  #2 敵のx座標に 50~750からランダムに選んだ値を 代入する
                    enemy.y = random.randint(50, HEIGHT-50) #3 滝のy座標に 50~540からランダムに選んだ値 を代入する 

                    if enemy.distance_to(boon) > 300:  #4 もし boonから300px以上 離れたなら
                        enemy.hit = False #5 プロパティhit に Falseを代入する
                        break    #6 繰り返しから抜ける        
スック
スック

コマ送りで 見せています。
本当は、一瞬で この動きをしているんだ

ラッチ先生
ラッチ先生

そして、
sayセイモジュールのtextテキスト_displayディスプレイ()クラスを使って
敵に襲われたら、動きを止めて セリフを言わせよう

pythonしよう!ゲームの技02:say()メゾットの解説
Python
def draw():
    screen.fill("white")
    boon.draw()
    enemy.draw(screen) 
    if beam.visible: 
        beam.draw()
    text_display.draw(screen)  #1 テキストディスプレイをスクリーンにつなげる
Python
def boon_move(): 
    global game 

    if game == "play": 
        boon.move_towards(mouse.pos, 3)

        if enemy.collide_pixel(boon) and not enemy.hit:  #2 敵が boonに触れて、敵が弾に当たっていなかったら
            game = "over"  #3 変数gameに "over"を代入する
            game_over()    #4 ゲームオーバーを 行う  
Python
def game_over():             #5 ゲームオーバーの動きを まとめる(関数)
    boon.image = "ouch_boon" #6 boonの画像を "ouch_boon"にする
    boon.say("Ouch!", 2, color="red", size=70, y_offset=-70) #7 「Ouch!」と2秒間言う
スック
スック

変数gameゲーム が “overオーバー“になったから、すべての動きが 止まったね

ラッチ先生
ラッチ先生

最後に 効果音を つけていこう

pythonしよう!ゲームの技02:効果音の再生プログラムの解説
スック
スック

今回のプログラムに『Chisato’s Website」サイトから
・ 弾の発射音: laser_gun_09_high_powered.wav
・ 敵の爆発音: synthesizer_09_ascend_short.wav
・ 敵に捕まる音: death_explosion_03_player.wav
 3つの効果音を お借りしました。 ありがとうございます。

Python
def on_key_down(key): 

    if key == keys.SPACE: 
        sounds.laser_gun_09_high_powered.play()  #1 弾の発射音を再生する
        beam.visible = True 
Python
def boon_move(): 
    global game 

    if game == "play": 
        boon.move_towards(mouse.pos, 3)

        if enemy.collide_pixel(boon) and not enemy.hit: 
            sounds.death_explosion_03_player.play()  #2 敵に捕まった効果音を再生する
            game = "over" 
Python
def enemy_move(): 
    global game 
    if game == "play": 
        if not enemy.hit:
            enemy.angle = enemy.angle_to(boon) 
            enemy.move_towards(boon, 2) 
            if enemy.collide_pixel(beam) and beam.visible: 
                sounds.synthesizer_09_ascend_short.play()  #3 弾が当たった効果音を再生する
                enemy.alpha_animation() 
スック
スック

これで、今回の学習は終了! おつかれさま

ラッチ先生
ラッチ先生

今回は、
シューティングゲームに効果音を入れたプログラムを 作りました。

boon シューティング! No.2
Python
import pgzrun
from pgzhelper import *
from visual import VisualEffect
import random
from say import text_display

WIDTH = 800
HEIGHT = 590

boon = Actor("boon", (400, 300))
enemy = VisualEffect("enemy", (700, 100)) 
beam = Actor("beam", (400, 300))

game = "play"  
mouse.pos = 400, 300 
beam.visible = False 
enemy.hit = False 
enemy.animation_speed = 3 

def draw():
    screen.fill("white")
    boon.draw()
    enemy.draw(screen) 
    if beam.visible: 
        beam.draw()
    text_display.draw(screen) 

def on_mouse_move(pos): 
    global game 

    mouse.pos = pos 
    if game == "play": 
        boon.angle = boon.angle_to(pos) 

def on_key_down(key): 

    if key == keys.SPACE: 
        sounds.laser_gun_09_high_powered.play() 
        beam.visible = True 

def boon_move(): 
    global game 

    if game == "play": 
        boon.move_towards(mouse.pos, 3)

        if enemy.collide_pixel(boon) and not enemy.hit: 
            sounds.death_explosion_03_player.play() 
            game = "over" 
            game_over()             

def beam_move(): 
    global game 

    if game == "play": 
        if not beam.visible: 
            beam.pos = boon.pos 
            beam.angle = boon.angle 
            beam.move_forward(50) 
        else: 
            beam.move_forward(20) 

            if beam.x < 0 or beam.x > WIDTH or beam.y < 0 or beam.y > HEIGHT: 
                beam.visible = False       

def enemy_move(): 
    global game 
    if game == "play": 
        if not enemy.hit:
            enemy.angle = enemy.angle_to(boon) 
            enemy.move_towards(boon, 2) 
            if enemy.collide_pixel(beam) and beam.visible: 
                sounds.synthesizer_09_ascend_short.play() 
                enemy.alpha_animation() 
                enemy.scale_animation(0.03, 4) 
                enemy.hit = True           
        else: 
            result = enemy.process_animation() 
            if result == "finished": 
                enemy.reset_effects() 

                while True: 
                    enemy.x = random.randint(50, WIDTH-50) 
                    enemy.y = random.randint(50, HEIGHT-50)

                    if enemy.distance_to(boon) > 300: 
                        enemy.hit = False 
                        break
                
def update(): 
    boon_move() 
    beam_move() 
    enemy_move() 

def game_over(): 
    boon.image = "ouch_boon" 
    boon.say("Ouch!", 2, color="red", size=70, y_offset=-70) 
    
pgzrun.go()
ラッチ先生
ラッチ先生

効果音は、soundsサウンズオブジェクトで 簡単に使えます。

スック
スック

みんなも好きな効果音を『soundsサウンズ』フォルダに入れて 鳴らしてみよう
それじゃ、またね!

スポンサーリンク
ABOUT ME
ラッチ先生
ラッチ先生
こんにちは!
「Pythonしよう!楽しく学べるプログラミング教室」の学長、ラッチです。

scratchのように楽しく学べるPython講座です。
・図やアニメーションを使って、わかりやすく楽しく学べる!
・毎回の授業が新しい発見の連続!
・プログラミングの考え方が身につき、自分のやりたいことが形にできるように。

この3点をモットーにサイトを立ち上げました。 よろしくお願いします
記事URLをコピーしました