量産

【Pygame Zero】量産04:時間差で障害物を降らせる

ratch2025

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

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

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「cigarette 」 by yuhei komatsu

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「synthesizer_09_ascend_short」:シンセサイザーで作った音

ラッチ先生
ラッチ先生

基礎プログラムと 画像を入れた
「量産04 バケツを よけろ!」zipフォルダを ダウンロードしてください

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

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

pythonしよう!量産04:バケツをよけろ!zipの中身
スポンサーリンク

マウスで boonを 動かす

バケツが 上から 落ちてくる

バケツにあたるとセリフを言う

BGM・効果音を 入れる

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「cigarette 」 by yuhei komatsu

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「synthesizer_09_ascend_short」:シンセサイザーで作った音

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

ラッチ先生
ラッチ先生

今回の「バケツを よけろ!」では、
boonボーンが バケツに当たる
・ バケツが ランダムな場所で 表示する
boonボーン が セリフを言う
プログラムが あります

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

pythonしよう!量産04:pgzhelperモジュールのインポートを解説
pythonしよう!量産04:randomモジュールのインポートを解説
pythonしよう!量産04:sayモジュールのインポートを解説
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
バケツが上からどんどん落ちてくるプログラムを 作っていきます。

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

スック
スック

リスト:backetsバケッツを作成して、その中にバケツを 追加していくんだ

スック
スック

backetsバケッツ[:] は、『リストのコピー』と 覚えておいてね

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

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

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

2つに 分けたよ

ラッチ先生
ラッチ先生

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

pythonしよう!量産04: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しよう!量産04:mouseオブジェクトを解説
pythonしよう!量産04:move_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クリエイト_backetバケット( ) を定義します。

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

pythonしよう!量産04:ポイント1を解説
Python
buckets = []                #1 リストbucketsに 空のリストを 代入する
Python
def draw():
    screen.blit("background", (0, 0))
    boon.draw()
    for bucket in buckets: #9 リストbucketsから バケツを取り出す
        bucket.draw()      #10 バケツを 表示する
Python
def create_bucket():                  #2 バケツを作る関数を 定義する
    x = random.randint(50, WIDTH-50)  #3 x座標に 50~750からランダムに決めて代入する
    y = 0                             #4 y座標に 0を代入する
    bucket = Actor("bucket", (x, y))  #5 バケツを 作る
    bucket.angle = random.choice([-45, 45]) #6 バケツの向きに -45か45を選ぶ
    buckets.append(bucket)  #7 リストbucketsに 追加する

clock.schedule_interval(create_bucket, 0.5) #8 0.5秒ごとに バケツを作る
pythonしよう!量産04:append( )メソッドを解説
pythonしよう!量産04:schedule_interval( )メソッドを解説
pythonしよう!量産04:リストbacketsの中身を解説
スック
スック

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

リストに入っているバケツが 表示されるよ

pythonしよう!量産04:for bucket in buckets: bucket.draw( )を解説
ラッチ先生
ラッチ先生

つぎは、
forフォー 文を使ってバケツを 下へ動かします。

下まで動いたら 削除します。

Python
def bucket_move():            #1 バケツの動きを 定義する
    for bucket in buckets[:]: #2 リストbucketsコピーから バケツを取り出す
        bucket.y += 5         #3 バケツのy座標を 5pxずつ増やす

        if bucket.y > HEIGHT: #4 もし バケツのy座標が y:800pxより大きくなったら
            buckets.remove(bucket) #5 バケツを リストbucketsから削除する

def update():
    boon_move()
    bucket_move() #6 バケツを 動かす

バケツの動き

pythonしよう!量産04:ポイント2を解説

ホントだ! 
バケツ「2」が 飛ばされるね

スック
スック
スック
スック

なるほどね!
リストbacketsバケッツ[ : ]は、
最後のバケツを取り出してから コピーするんだね

ラッチ先生
ラッチ先生

collidelistコライドリスト_pixelピクセル( )メソッドを使って、
バケツに当たったら セリフを言うようにします。

pythonしよう!量産04:collidelist_pixel( )メソッドの解説
Python
def draw():
    screen.blit("background", (0, 0))
    boon.draw()
    for backet in backets:
        backet.draw()
    text_display.draw(screen) #1 テキストディスプレイを装備する
Python
def boon_move():
    global game

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

        if boon.collidelist_pixel(buckets) != -1: #2 もし バケツに触れたら
            game = "over"  #3 変数gameに overを代入する
            clock.unschedule(create_bucket) #4 create_backet()関数を止める
            boon.image = "boon_ouch" #5 boonの画像を "boon_ouch"にする
            boon.say("Ouch!", 2, color = "red", size=70, y_offset=-70)    #6 boonが 「Ouch!」と2秒間言う
スック
スック

あれっ? 
バケツに当たったときの数字が 「2, 1, -1」と変化してるよ

ラッチ先生
ラッチ先生

それは、当たったバケツの順番が 変わったからだよ

pythonしよう!量産04:collidelist_pixel(buckets)の解説
スック
スック

わかったよ!
boonボーンに触れている間に リストbacketsバケッツの順番が 変わったんだね

pythonしよう!量産04:sayメソッドの解説
pythonしよう!量産04:unschedule( )を解説

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「cigarette 」 by yuhei komatsu

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「synthesizer_09_ascend_short」:シンセサイザーで作った音

ラッチ先生
ラッチ先生

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

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

pythonしよう!量産04:MP3
pythonしよう!量産04:zipの中身
pythonしよう!量産04:musicモジュールの解説
Python
def boon_move():
    global game

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

        if boon.collidelist_pixel(backets) != -1:
            game = "over"
            music.stop() #2 BGMを 止める
Python
music.play("cigarette")   #1 BGMを 流す
スック
スック

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

ラッチ先生
ラッチ先生

最後に
boonボーンが バケツに当たった時に 効果音をつけましょう!

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

次の手順で 行います

pythonしよう!量産04:WAVファイル
pythonしよう!量産04:zipの中身
スック
スック

今回のプログラムに『Chisato’s Website」サイトから
・ シンセサイザーで作った音: synthesizer_09_ascend_short
 効果音を お借りしました。 ありがとうございます。

Python
def boon_move():
    global game

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

        if boon.collidelist_pixel(buckets) != -1:
            game = "over"
            music.stop()
            sounds.synthesizer_09_ascend_short.play() #1効果音を入れる

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「cigarette 」 by yuhei komatsu

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「synthesizer_09_ascend_short」:シンセサイザーで作った音

スック
スック

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

ラッチ先生
ラッチ先生

今回は、
上からバケツが落ちてくるプログラムを 作りました。

バケツを よけろ!
Python
import pgzrun
from pgzhelper import *
import random
from say import text_display

WIDTH = 800
HEIGHT = 590

boon = Actor("boon", (400, 300))
buckets = []

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

def draw():
    screen.blit("background", (0, 0))
    boon.draw()
    for bucket in buckets:
        bucket.draw()
    text_display.draw(screen)

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)

        if boon.collidelist_pixel(buckets) != -1:
            game = "over"
            music.stop()
            sounds.synthesizer_09_ascend_short.play()
            clock.unschedule(create_bucket)
            boon.image = "boon_ouch"
            boon.say("Ouch!", 2, color = "red", size=70, y_offset=-70)      

def create_bucket():
    x = random.randint(50, WIDTH-50)
    y = 0
    backet = Actor("backet", (x, y))
    bucket.angle = random.choice([-45, 45])
    buckets.append(bucket)

clock.schedule_interval(create_bucket, 0.5)

def bucket_move():
    for bucket in buckets[:]:
        bucket.y += 5

        if bucket.y > HEIGHT:
            buckets.remove(bucket)

def update():
    boon_move()
    bucket_move()

music.play("cigarette")

pgzrun.go()
ラッチ先生
ラッチ先生

リストからキャラクターを削除する場合は、
リストのコピーを 使ってね。

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

forフォー backetバケット inイン backetsバケッツ[ : ] : の使い方を 覚えてね!

それじゃ、またね!

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

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

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