動き2

【Pygame Zero】的当てゲームを作ろう!左右移動

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

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

今回のプロジェクトは、こちら!
ラッチ先生
ラッチ先生

今回のプロジェクトには、
boonの他に 青いボールが登場します。
青いボールの画像と基礎プログラムを入れた
「動き2-2 ボーンをねらえ」zipフォルダを ダウンロードしてください

pythonしよう!動き2-2:ボーン・ボールを表示する
pythonしよう!動き2-2:ボーンをねらえ.zipの中身
スック
スック

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

参考記事
【Pygame Zero】スクリーンに画像を 表示させる
【Pygame Zero】スクリーンに画像を 表示させる
スポンサーリンク
コードを 書こう
ボールをクリックして 斜めに動かす
boonを左右に動き続ける
ボールに当たったら セリフを 2秒間 言う
プログラムを 実行してみよう
ラッチ先生
ラッチ先生

今回のプロジェクトでは、
boonボーン が セリフを 言うので sayセイモジュールを用意しました

Python
import pgzrun
from pgzhelper import *
from say import text_display 
pythonしよう!動き2-2:sayモジュールの解説
ラッチ先生
ラッチ先生

今回の的当てゲームのプログラムを作る上で
大事なポイントが 2つあります

スック
スック

ボールが 動いている時が “play”
ゲーム中だよ

pythonしよう!動き2-2:ポイント2:キャラクターごとにプログラムをまとめる
スック
スック

わかりやすくなるね

ラッチ先生
ラッチ先生

それでは、
ボールを クリックしたら 動くプログラムを 作ります。

変数ballボール には、Actorアクター()クラス(設計図)が 入って
ボールを動かす属性やメゾットが たくさん入っています

pythonしよう!動き2-2:Actor()クラスの解説

変数ball に、「 . (ドット)」を属性やメゾットを 使いましょう

ラッチ先生
ラッチ先生

まずは、ボールをクリックしたら
変数gameゲーム が “readyレディ” から “playプレイ” になるプログラムです。

Python
game = "ready"  #1 変数gameの最初のデータ:"ready"
ball.angle = 50 #2 ボールの向きに 50度 代入する

def draw():
    screen.fill("white")
    boon.draw()
    ball.draw()
    
def on_mouse_down(pos): #3 クリックした座標を取得
    global game #4 グローバル変数game

    if ball.collidepoint(pos): #5 もし、ボールにクリックしたら
        game = "play" #6 変数gameに "play" 代入する
pythonしよう!動き2-2:クリックの座標にpos解説
pythonしよう!動き2-2:ball.collidepoint(pos)メゾットの解説
スック
スック

20. globalグローバル gameゲーム

変数gameゲーム を グローバル変数にすることを 忘れないでね
readyレディ” から “playプレイ“に 変わるよ

ラッチ先生
ラッチ先生

つぎは、
ballボール_moveムーヴ関数にボールの動きを まとめよう

pythonしよう!動き2-2:move_forward()メゾットの解説
Python
def ball_move(): #1 ボールを動かす関数
    global game #2 グローバル

    if game == "play": #3 もし、変数gameが "play"なら
        ball.move_forward(10) #4 ボールを10pxずつ 動かす
        
        if ball.x > WIDTH-35 or ball.x < 35: #5 もし、左右の壁に当たったら
            ball.angle = 180 - ball.angle #6 跳ね返りの向きにする
        if ball.y > HEIGHT-35 or ball.y < 35: #7 もし、上下の壁に当たったら
            ball.angle = -ball.angle #8 跳ね返りの向きにする


pythonしよう!動き2-2:blueball画像の解説
ラッチ先生
ラッチ先生

ballボール_moveムーヴ関数に、ボールの動きをまとめましたが、
このままでは、動きません。

defデフ updateアップデート関数の中に 入れましょう

pythonしよう!動き2-2:update関数の解説
Python
def update():   #1 更新する
    ball_move()  #2  ball_move関数 
    
pgzrun.go()
スック
スック

クリックしたら ボールが 動いたね

ラッチ先生
ラッチ先生

boonボーンのx座標を変えて左右の動きを作ります。

Python
boon_speed = 5 boonの動く速さ

変数boonボーン_speedスピード を 作ります。初期値:5

Python
def boon_move(): #1 boonを動かす関数
    global boon_speed #2 グローバル


    boon.x += boon_speed #3 boonを動かす
    if boon.x > WIDTH-50 or boon.x <50: #4 跳ね返る
        boon_speed = -boon_speed         #ステップ1 スピード反転
        boon.angle = 180-boon.angle      #ステップ2 向きを反転
        boon.flip_y = not boon.flip_y    #ステップ3 上下反
  

def update():
    ball_move() 
    boon_move() #1 boon_move関数を更新する 
pythonしよう!動き2-2:boonの画像の解説
pythonしよう!動き2-2:flip_yの解説
スック
スック

boonも 動いたよ

ラッチ先生
ラッチ先生

textテキスト_displayディスプレイオブジェクトを使って
キャラクターに セリフを 言わせるよ

Python
def draw():
    screen.fill("white")
    boon.draw()
    ball.draw()
    text_display.draw(screen) #1 画面に セリフを表示できる
pythonしよう!動き2-2:TextDisplayクラスのdraw()メゾットの解説
スック
スック

これで、キャラクターにセリフを言わせる準備が できました

ラッチ先生
ラッチ先生

ボールが boonボーンに衝突したら、セリフを言わせるよ

衝突判定は、collideコライド_pixelピクセル( ) メゾットを使います。

pythonしよう!動き2-2:collide_pixel()メゾットの解説
Python
def ball_move(): 
    global game #2-2 グローバル

    if game == "play": #2-3 ボールを動かす #4-4 or "hit"
        ball.move_forward(10)
        if ball.x > WIDTH-35 or ball.x < 35: # 2-5 跳ね返る
            ball.angle = 180 - ball.angle
        if ball.y > HEIGHT-35 or ball.y < 35:
            ball.angle = -ball.angle
        if ball.collide_pixel(boon): #2 もし、boonに衝突したら
            boon.say("Ouch!", 2, size=70, color="red", y_offset=-70) #3 boonに、セリフを言わせる
pythonしよう!動き2-2:TextDisplayクラスのsay()メゾットの解説
pythonしよう!動き2-2:say()メゾット
の解説
スック
スック

あれっ? boonボーンは、セリフを言いながら動いてるよ

ラッチ先生
ラッチ先生

はい。これでもいいんだけれど、
お好みでセリフを言っている時、boonボーンの動きを止めたい場合は
isイズ_talkingトーキング( )メゾットと使おう

pythonしよう!動き2-2:TextDisplayクラスis_talking()メゾットの解説
Python
def boon_move(): 
    global boon_speed 

    if not boon.is_talking(): #もしboonが話していなければ
        boon.x += boon_speed 
        if boon.x > WIDTH-50 or boon.x <50: 
            boon_speed = -boon_speed
            boon.angle = 180-boon.angle
            boon.flip_y = not boon.flip_y
pythonしよう!動き2-2:is_talking()メゾットの解説

pythonしよう!動き2-2:is_talkint()メゾットの解説
スック
スック

44~48.インデント(字下げ:4文字下げる)してね

ラッチ先生
ラッチ先生

これで、boonボーンが「Ouchアウチィ!」と言わない時だけ 動く。
つまり、
boonボーンが「Ouchアウチィ!」と言っている間は 動かないんだ

スック
スック

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

ラッチ先生
ラッチ先生

今回は、
クリックしたらボールが動き boonボーンに衝突したら「Ouchアウチィ!」と言うプログラムを作りました。

ボーンを ねらえ!
Python
import pgzrun
from pgzhelper import *
from say import text_display

WIDTH = 800
HEIGHT = 590

boon = Actor("boon", (400, 100))
ball = Actor("blueball", (400, 500))

game = "ready"  
ball.angle = 50

boon_speed = 5 

def draw():
    screen.fill("white")
    boon.draw()
    ball.draw()
    text_display.draw(screen) 

def on_mouse_down(pos): 
    global game 

    if ball.collidepoint(pos):
        game = "play" 

def ball_move(): 
    global game 

    if game == "play": 
        ball.move_forward(10)
        if ball.x > WIDTH-35 or ball.x < 35: 
            ball.angle = 180 - ball.angle
        if ball.y > HEIGHT-35 or ball.y < 35:
            ball.angle = -ball.angle
        if ball.collide_pixel(boon): 
            boon.say("Ouch!", 2, size=70, color="red", y_offset=-70) 

def boon_move(): 
    global boon_speed 

    if not boon.is_talking(): 
        boon.x += boon_speed 
        if boon.x > WIDTH-50 or boon.x <50: 
            boon_speed = -boon_speed
            boon.angle = 180-boon.angle
            boon.flip_y = not boon.flip_y

def update():
    ball_move() 
    boon_move() 

pgzrun.go()
pythonしよう!動き2-2:ポイント2:キャラクターごとにプログラムをまとめるの解説
ラッチ先生
ラッチ先生

今回は、
キャラクターごとに 動きをまとめた関数を 作りました。

プログラムが長くなっていくと、
このようにキャラクターごとにプログラムをまとめておくと
見やすく、わかりやすいです。

みなさんも 挑戦してみてください

スック
スック

それじゃ、またね!

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

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

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