量産

【Pygame Zero】量産03:複数のキャラクターを動かす

ratch2025

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

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

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

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

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「口笛ショッピング 」 by ゆうり(from Yuli Audio Craft)

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「accent_synth_bell_e_major_01a_mono」:アクセント

ラッチ先生
ラッチ先生

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

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

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

pythonしよう!量産03:ボールをよけろ!zipの中身
スポンサーリンク

マウスで boonを 動かす

ボールが 3秒ごと出現して ななめに動く

ボールに当たったらセリフを言う

BGM・効果音を 入れる

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「口笛ショッピング 」 by ゆうり(from Yuli Audio Craft)

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「accent_synth_bell_e_major_01a_mono」:アクセント

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

ラッチ先生
ラッチ先生

今回の「本物を 探せ!」では、
boonボーンが ボールに当たる
boonボーンを ランダムな場所へ
boonボーン が セリフを言う
プログラムが あります

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

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

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

ラッチ先生
ラッチ先生

今回は、
3個のボールを動かすプログラムを 作っていきます。

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

スック
スック

リスト:ballsボールズ作成して、その中に3個のボールを 入れるんだ

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

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

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

2つに 分けたよ

ラッチ先生
ラッチ先生

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

pythonしよう!量産03: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しよう!量産03:mouseオブジェクトを解説
pythonしよう!量産03: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 マウスの方へ 5pxずつ 動く
スック
スック

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

ラッチ先生
ラッチ先生

まず、
3秒ごとに ボールを表示するプログラムを作ります。

ボールの数は3個までにします。

スック
スック

ボールを3個作るということは…⁉
scratchスクラッチでいうクローンだ。

最初に空のリストを 作るんだったよね

pythonしよう!量産03:ポイント1を解説
ラッチ先生
ラッチ先生

scheduleスケジュール_intervalインターバル( ) メソッドを使って
3秒ごとに ボールを 作るよ

Python
balls = []             #1 リストballsに 空のリストを代入する

def draw():
    screen.blit("background", (0, 0))
    boon.draw()
    for ball in balls:  #10 リストballsから ボールを取り出して
        ball.draw()     #11 ボールを 表示する
Python
def create_ball():     #2 ボールを作成する関数を 定義する  
    if len(balls) < 3: #3 もし リストballsの要素の数が 3未満なら
        x = random.randint(35, WIDTH-35)  #4 x座標に 35~765からランダムに決めて代入する
        y = random.randint(35, HEIGHT-35) #5 y座標に 35~555からランダムに決めて代入する
        ball = Actor("ball", (x, y))  #6 ボールを 作る
        ball.angle = 45      #7 ボールの向きを 45度にする 
        balls.append(ball)   #8 リストballsに 追加する
Python
clock.schedule_interval(create_ball, 3.0) #9 3秒ごとに ボールを作成する
pythonしよう!量産03:len( )関数を解説
pythonしよう!量産03:append( )メソッドを解説
pythonしよう!量産03:schedule_interval( )メソッドを解説
pythonしよう!量産03:リストballsの中身を解説
スック
スック

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

pythonしよう!量産03:for ball in balls: ball.draw( )を解説

リストに入っているボールが 表示されるよ

pythonしよう!量産03:for ball in balls: ball.draw( )を解説2
ラッチ先生
ラッチ先生

つぎは、
forフォー 文を使ってboonボーンを 動かします。

Python
def ball_move():           #1 ボールを動かす関数を定義する

    if game == "play":     #2 もし 変数gameが playなら
        for ball in balls: #3 リストballsから 順に取り出す
            ball.move_forward(10) #4 ボールを 10pxずつ動かす

            if ball.x < 35 or ball.x > WIDTH-35: #5 ボールのx座標が 35未満 または 765以上なら
                ball.angle = 180 - ball.angle #6 ボールの向きに 180-ボールの向き の角度を代入する
            if ball.y < 35 or ball.y > HEIGHT-35: #7 もし ボールのy座標が 35未満 または 555以上なら
                ball.angle = -ball.angle  #8 ボールの向きに -(ボールの向き)の角度を代入する   

def update():   
    boon_move() 
    ball_move()  #9 ボールを動かす
pythonしよう!量産03:四方の壁の跳ね返りの角度を解説
スック
スック

おおっ! 3つのボールが 別々に 動いているぞ!

ラッチ先生
ラッチ先生

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

pythonしよう!量産03:collidelist_pixel( )を解説
Python
def draw():
    screen.blit("background", (0, 0))
    boon.draw()
    for ball in balls: 
        ball.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(balls) != -1: #2 もし ボールにぶつかったら
            game = "over"                 #3 変数gameを overを代入する            
            clock.unschedule(create_ball) #4 ボールを作り出す関数を中止する                
            boon.image = "boon_ouch"      #5 boonの画像を boon_ouchにする      
            boon.say("Ouch!", 2 , color= "red", size=70, y_offset=-70)  #6 「Ouch!」と2秒間 言う
pythonしよう!量産03:say( )を解説
pythonしよう!量産03:unschedule( )を解説
スック
スック

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「口笛ショッピング 」 by ゆうり(from Yuli Audio Craft)

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「accent_synth_bell_e_major_01a_mono」:アクセント

ラッチ先生
ラッチ先生

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

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

pythonしよう!量産03:MP3ファイル
pythonしよう!量産03:ボールをよけろ!zipの中身
pythonしよう!量産03:musicモジュールの解説
Python
def boon_move(): 
    global game 
    
    if game == "play": 
        boon.move_towards(mouse.pos, 5) 

        if boon.collidelist_pixel(balls) != -1: 
            game = "over"                  
            clock.unschedule(create_ball)  
            music.stop()     #2 BGMを 止める   
Python
music.play("口笛ショッピング")  #1 BGMを 流す
スック
スック

今回のプログラムに「DOVA-SYNDROME」サイトから
「口笛ショッピング 」 by ゆうり(from Yuli Audio Craft)
 BGMの曲として お借りしました。 ありがとうございます。

ラッチ先生
ラッチ先生

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

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

次の手順で 行います

pythonしよう!量産03:WAVファイル
pythonしよう!量産03:ボールをよけろ!zipの中身
スック
スック

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

Python
def boon_move(): 
    global game 
    
    if game == "play": 
        boon.move_towards(mouse.pos, 5) 

        if boon.collidelist_pixel(balls) != -1: 
            game = "over"                  
            clock.unschedule(create_ball)  
            music.stop()                   
            sounds.accent_synth_bell_e_major_01a_mono.play()  #1 効果音を 入れる

BGM提供:DOVA-SYNDROME
https://dova-s.jp/
「口笛ショッピング 」 by ゆうり(from Yuli Audio Craft)

効果音提供:Chisato’s Website
https://chisatosound.sakura.ne.jp/index.html
「accent_synth_bell_e_major_01a_mono」:アクセント

スック
スック

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

ラッチ先生
ラッチ先生

今回は、
3個のボールを動かすプログラムを 作りました。

ボールを よけろ!
Python
import pgzrun
from pgzhelper import *
import random
from say import text_display

WIDTH = 800
HEIGHT = 590

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

game = "play" 
mouse.pos = 400, 300 
balls = [] 

def draw():
    screen.blit("background", (0, 0))
    boon.draw()
    for ball in balls: 
        ball.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(balls) != -1: 
            game = "over"                  
            clock.unschedule(create_ball)  
            music.stop()                   
            sounds.accent_synth_bell_e_major_01a_mono.play() 
            boon.image = "boon_ouch"       
            boon.say("Ouch!", 2 , color= "red", size=70, y_offset=-70) 
            
def create_ball(): 
    if len(balls) < 3:
        x = random.randint(35, WIDTH-35)   
        y = random.randint(35, HEIGHT-35)
        ball = Actor("ball", (x, y)) 
        ball.angle = 45      
        balls.append(ball)  
        
def ball_move(): 

    if game == "play": 
        for ball in balls: 
            ball.move_forward(10)

            if ball.x < 35 or ball.x > WIDTH-35:
                ball.angle = 180 - ball.angle
            if ball.y < 35 or ball.y > HEIGHT-35:
                ball.angle = -ball.angle    

def update():   
    boon_move() 
    ball_move() 

clock.schedule_interval(create_ball, 3.0) 

music.play("口笛ショッピング") 

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

複数のキャラクターを動かすときは、
forフォー 文: forフォー ballボール inイン ballsボールズ: を使って
ballボール に 動かすプログラムを 書いていこう

スック
スック

1.リストballsボールズから 順にボールを取り出して
2.ボールを 動かす


これを 一瞬で 行っているから
複数のキャラクターが動くように見えているんだ
すごいよね

それじゃ、またね!

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

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

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