量産

【Pygame Zero】量産06:浮かび上がる風船をパンチしよう!

ratch2025

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

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

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Kirakira_ToyBoxby こうだつの

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Synth-Bell. E-Major [01A] (Monophonic)」:アクセント
「Button [06-3] (Cancel)」:ボタン音

ラッチ先生
ラッチ先生

基礎プログラムと 画像を入れた
「量産06 風船に パンチ!」zipフォルダを ダウンロードしてください

pythonしよう!量産06:背景画を表示する
pythonしよう!量産06:blit( ) メソッドの解説
スック
スック

今回は、blitブリット( )メソッドを使って 背景画像を 入れてみたよ

pythonしよう!量産06:風船を パンチ!zipの中身
スポンサーリンク

マウスで boonを 動かす

風船が 次々と 現れる

boonが 風船にパンチすると 消える

風船が 上の端に到着すると ゲームオーバー

BGM・効果音を 入れる

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Kirakira_ToyBoxby こうだつの

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Synth-Bell. E-Major [01A] (Monophonic)」:アクセント
「Button [06-3] (Cancel)」:ボタン音

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

ラッチ先生
ラッチ先生

今回の「風船に パンチ!」では、
boonボーンが 風船にパンチする
・ 風船を 下の端から ランダムに 出現する
プログラムがあります。

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

pythonしよう!量産06:pgzhelperモジュールの解説
pythonしよう!量産06:randomモジュールの解説
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
風船が 次々と現れて上がっていくプログラムを 作っていきます。

scratchスクラッチで言う「クローン」。
pygama zeroでは、次の手順で プログラムします

スック
スック

リスト:balloonsバルーンズを 作成して、その中にねずみを 追加していくんだ

スック
スック

balloonsバルーンズ[:] は、『リストのコピー』と 覚えておいてね

pythonしよう!量産06:ポイント3の解説
スック
スック

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

pythonしよう!量産06:ポイント4の解説
スック
スック

2つに 分けたよ

ラッチ先生
ラッチ先生

angleアングル_toトゥー( ) メソッドで、
boonボーンを マウスの方へ向くようにします

pythonしよう!量産06:angle_to()メソッドの解説
Python
game = "play"           #1 変数game 宣言 初期値:play
Python
def on_mouse_move(pos): #2 マウスが動いた時 引数posに 座標が代入される
    global game         #3 グローバル変数 game

    if game == "play":  #4 もし 変数gameが playなら
        boon.angle = boon.angle_to(pos)  #5 boonの向きに マウスの方へ向く角度を 代入する
スック
スック

マウスが動くと、引数posポスの中に マウスの座標が 代入されるんだ

ラッチ先生
ラッチ先生

つぎは、
マウスオブジェクトにプロパティposポスを追加して、
moveムーヴ_towardsトゥーワーズ( )メソッドを使って boonボーンをマウスの方へ 動かします

pythonしよう!量産06:mouseオブジェクトの解説
pythonしよう!量産06:mouse_towards()メソッドの解説
Python
mouse.pos = 400, 300  #1 プロパティ:posに (400, 300)を 代入する
Python
def on_mouse_move(pos): 
    global game 

    if game == "play": 
        boon.angle = boon.angle_to(pos) 
        mouse.pos = pos  #2 追加プロパティposに マウスの座標を代入する

def boon_move():  #3 boonの動きを 定義する
    global game   #4 グローバル変数 game

    if game == "play":  #5 もし 変数gameが playなら
        boon.move_towards(mouse.pos, 5) #6 boonが マウスの方へ5pxずつ 動く
Python
def update():   #7 更新する
    boon_move() #8 boonを 動かす
スック
スック

これで、boonボーン の動きは 完了です

ラッチ先生
ラッチ先生

最初に
風船を作る関数:cleateクリエイト_balloonバルーン( ) を定義します。

そして、
scheduleスケジュール_intervalインターバル()メソッドを使って
0.5秒経ったら、風船を作っていきましょう

pythonしよう!量産06:ポイント1の解説
Python
balloons = [] #1 リストballoonsに 空のリストを 代入する 

def create_balloon():  #2 風船を作る関数を 定義する
    x = random.randint(50, WIDTH-50)  #3 x座標に 50~750からランダムに決めて代入する
    y = HEIGHT #4 y座標に 590を代入する
    balloon = Actor("balloon", (x, y))  #5 風船を 作る
    balloon.speed = random.uniform(1,5) #6 追加プロパティspeedに 1~の間の小数をランダムに決める
    balloons.append(balloon) #7 リストballoonsに 追加する

clock.schedule_interval(create_balloon, 0.5)  #8 0.5秒ごとに 風船を作る
    
def draw():
    screen.blit("bg", (0, 0))
    boon.draw()
    for balloon in balloons: #9 リストballoonsから 風船を取り出す
        balloon.draw()       #10 風船を 表示する
pythonしよう!量産06:uniform()関数の解説
pythonしよう!量産06:append()メソッドを解説
pythonしよう!量産06:schedule_interval( )メソッドを解説
pythonしよう!量産06:リストballoonsの中身を解説
スック
スック

ここまでが、風船が 作られるポイント!
まだ、スクリーンには 表示されないよ

pythonしよう!量産06:for balloon in balloons: balloon.draw( )を解説
ラッチ先生
ラッチ先生

次に、プロパティ: speedスピードを使って
風船を 動かしてみよう!

Python
def balloon_move():    #1 風船の動きを 定義する
    global game        #2 グローバル変数 game

    if game == "play": #3 もし 変数gameが play だったら
        for balloon in balloons[:]: #4 コピーリストballoonsから 風船を取り出す    
            balloon.y -= balloon.speed  #5 風船のy座標を プロパティspeedずつ減らす
Python
def update(): 
    boon_move() 
    balloon_move()  #6 風船を 動かす
スック
スック

風船ごとにプロパティ:speedスピードが 違うから 速さも違うね!

ラッチ先生
ラッチ先生

collideコライド_pixelピクセル( ) メソッドを使って、boonボーンが風船にパンチしたら
消えるようにするよ

pythonしよう!量産06:collide_pixel()メソッドの解説
pythonしよう!量産06:remove()メソッドの解説
Python
def balloon_move(): 
    global game 

    if game == "play":
        for balloon in balloons[:]:    
            balloon.y -= balloon.speed 

            if balloon.collide_pixel(boon):  #1 もし 風船に boonが衝突したら
                balloons.remove(balloon) #2 リストballoonsから 風船を削除する

ポイント1

スック
スック

ああっ!
風船「2」が 飛ばされるね

スック
スック

なるほどね!
リストballoonsバルーンズ[:] は、
最後の風船を取り出してから コピーするんだね

ラッチ先生
ラッチ先生

風船が上の端に着いたら ゲームオーバーになります

clearクリア( ) メソッドを使って、他の風船を 削除しましょう

pythonしよう!量産06:clear()メソッドの解説
Python
message = Actor("message", (400, 300))  #6 メッセージを 生成する
Python
def draw():
    screen.blit("bg", (0, 0))
    boon.draw()
    for balloon in balloons: 
        balloon.draw()
    if game == "over":  #7 もし 変数gameが overなら
        message.draw()  #8 メッセージを 表示する
Python
def balloon_move(): 
    global game 

    if game == "play":
        for balloon in balloons[:]:    
            balloon.y -= balloon.speed 

            if balloon.collide_pixel(boon): 
                balloons.remove(balloon)

            if balloon.y <= 50:  #1 もし 風船のy座標が 50以下なら
                game = "over"    #2 変数gameに overを代入する
                clock.unschedule(create_balloon) #3 create_balloon()関数を 中止する
                balloons.clear() #3 リストballoonsを 空にする
                balloons.append(balloon)  #4 リストballoonsに 風船を追加する
                boon.image = "boon_ouch"  #5 boonの画像を boon_ouchにする
pythonしよう!量産06:ゲームオーバーポイント1の解説
pythonしよう!量産06:unschedule()メソッドの解説
スック
スック

変数gameゲームが “overオーバー“になったから
上の端にある風船は、動かないんだよ

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Kirakira_ToyBoxby こうだつの

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Synth-Bell. E-Major [01A] (Monophonic)」:アクセント
「Button [06-3] (Cancel)」:ボタン音

ラッチ先生
ラッチ先生

それでは、BGMを 入れてみましょう

Pythonパイソン zeroゼロには、musicミュージックオブジェクトが標準装備であります。
やり方、以下の手順です

pythonしよう!量産06:MP3ファイル

☆ Pygame zeroでは英語の大文字が 使えません。 エラーが出ます
 小文字 に直します

pythonしよう!量産06:mousicフォルダの解説
pythonしよう!量産06:musicモジュールの解説
Python
def balloon_move(): 
    global game 

    if game == "play":
        for balloon in balloons[:]:    
            balloon.y -= balloon.speed 

            if balloon.collide_pixel(boon): 
                balloons.remove(balloon)

            if balloon.y <= 50:  
                game = "over" 
                music.stop()  #2 BGMを 止める
Python
music.play("kirakira_toybox")  #1 BGMを 流す
スック
スック

今回のプログラムに「DOVA-SYNDROME」サイトから
Kirakira_ToyBoxby こうだつの
 BGMの曲として お借りしました。 ありがとうございます。

ラッチ先生
ラッチ先生

最後に
効果音をつけましょう!
 ・ 風船を パンチする音
 ・ 風船が 上端に到達した音

Pythonパイソン zeroゼロには、soundsサウンズオブジェクトが標準装備であります。

次の手順で 行います

pythonしよう!量産06:WAVファイル
pythonしよう!量産06:WAVファイル
pythonしよう!量産06:soundsフォルダの解説
pythonしよう!量産06:play()メソッドの解説
スック
スック

今回のプログラムに
Chisato’s Website」サイトから
Accent. Synth-Bell. E-Major [01A] (Monophonic)」
アクセント
「Button [06-3] (Cancel)」:ボタン音

 効果音を お借りしました。 ありがとうございます。

Python
def balloon_move(): 
    global game 

    if game == "play":
        for balloon in balloons[:]:    
            balloon.y -= balloon.speed 

            if balloon.collide_pixel(boon): 
                sounds.button_06_3_cancel.play()  #1 効果音を入れる
                balloons.remove(balloon)

            if balloon.y <= 50: 
                sounds.accent_synth_bell_e_major_01a_mono.play() #2 効果音を入れる

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
Kirakira_ToyBoxby こうだつの

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「Accent. Synth-Bell. E-Major [01A] (Monophonic)」:アクセント
「Button [06-3] (Cancel)」:ボタン音

スック
スック

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

ラッチ先生
ラッチ先生

今回は、
上へ動く風船を パンチするプログラムを 作りました。

風船に パンチ!
Python
import pgzrun
import random
from pgzhelper import *

WIDTH = 800
HEIGHT = 590

boon = Actor("boon", (400, 300))
message = Actor("message", (400, 300)) 

game = "play" 
mouse.pos = 400, 300 

balloons = [] 

def create_balloon(): 
    x = random.randint(50, WIDTH-50) 
    y = HEIGHT
    balloon = Actor("balloon", (x, y)) 
    balloon.speed = random.uniform(1,5) 
    balloons.append(balloon) 

clock.schedule_interval(create_balloon, 0.5) 
    
def draw():
    screen.blit("bg", (0, 0))
    boon.draw()
    for balloon in balloons: 
        balloon.draw()
    if game == "over": 
        message.draw()
 
def on_mouse_move(pos): 
    global game 

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

def boon_move(): 
    global game 

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

def balloon_move(): 
    global game 

    if game == "play":
        for balloon in balloons[:]:    
            balloon.y -= balloon.speed 

            if balloon.collide_pixel(boon): 
                sounds.button_06_3_cancel.play() 
                balloons.remove(balloon)

            if balloon.y <= 50: 
                sounds.accent_synth_bell_e_major_01a_mono.play() 
                game = "over" 
                music.stop() 
                clock.unschedule(create_balloon) 
                balloons.clear() 
                balloons.append(balloon) 
                boon.image = "boon_ouch"  
    
def update(): 
    boon_move() 
    balloon_move() 

music.play("kirakira_toybox") 
    
pgzrun.go()
ラッチ先生
ラッチ先生

風船の動きの速さを 変えたい時は
プロパティ:speedスピードを 追加して ランダムに数字を代入しました

スック
スック

Actorアクタークラスで作った風船は、
自分でプロパティを作って追加できるよ

それじゃ、またね!

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

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

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