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

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


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

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



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

学習の流れ
プログラミングの仕方を説明します
sayモジュールを 用意する

boonをクリックしたら 右へ動く

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


わかりやすくなるね


変数boon_stateが “play” になると
boonが 動くようにしたよ

それでは、
boonを クリックしたら 動くプログラムを 作ります。
変数boonは、Actor()クラス(設計図)が 入って
boonを動かす属性やメゾットが たくさん入っています

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

まずは、boonをクリックしたら
変数boon_stateが、 “ready” から “play” になるプログラムです。
boon_state = "ready" #1 変数boon_stateの最初のデータ:"ready"
target_speed = 5
def draw():
screen.fill("white")
boon.draw()
target.draw()
text_display.draw(screen)
def on_mouse_down(pos): #2 クリックした座標を取得 posに代入される
global boon_state #3 グローバル変数:boon_state
if boon.collidepoint_pixel(pos): #4 boonをクリックしたら
boon_state = "play" #5 変数boon_stateに"play"が 代入される
ポイント1
20.on_mouse_down(pos) 関数で
クリックした場所を引数「pos」に 入れる

ポイント2
23. boon.collidepoint_pixel(pos)
メゾットで、boonのクリック判定を する


21. global boon_state
変数boon_state を グローバル変数にすることを 忘れないでね
“ready” から “play“に 変わるよ

つぎは、
boon_move関数にボールの動きを まとめるよ
そして、
def update()関数の中に 入れて、更新させよう

def boon_move(): #1 boonの動きをまとめる関数
global boon_state #2 グローバル変数 boon_state
if boon_state == "play": #3 もし 変数boon_stateが"play"になったら
boon.x += 10 #4 boonのx座標を 10ずつ 増やす
if boon.x > WIDTH: #5 もし boonのx座標が WIDTH(800)より大きくなったら
boon.x = 100 #6 boonのx座標を 100に代入する(元に戻す)
boon_state = "ready" #7 変数boon_stateに "ready"を代入する
def update(): #8 更新する
boon_move() #9 boon_move関数

クリックしたら boonが 動いたね
的を 上下に 動かす

targetのy座標を変えて、上下の動きを作ります。
target_speed = 5 #1 変数target_speedを作る 初期値:5
def target_move(): #2 的の動きをまとめる
global target_speed #3 グローバル変数target_speed
target.y += target_speed #4 的のy座標を 変数target_speedずつ増やす
if target.y > HEIGHT-50 or target.y < 50: #5 上下の端に触れたら
target_speed = -target_speed #6 変数target_speedに -1 × target_speed を 代入する
def update():
boon_move()
target_move() #7 target_move()関数
ポイント1
green_targetの画像の大きさは、100 × 100 px
跳ね返り地点
41. if target.y > HEIGHT-50 or target.y < 50:


的は、
target_speedが、「5」なら、下に動き、
target_speedが、「-5」なら、上に動くよ
的に当たったら セリフを言う

text_displayオブジェクトを使って
キャラクターに セリフを 言わせるよ
def draw():
screen.fill("white")
boon.draw()
target.draw()
text_display.draw(screen) #1 テキスト表示機能を準備します


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

boonに当たったら、的にセリフを言わせるよ
衝突判定は、collide_pixel( ) メゾットを使います。

def target_move():
global target_speed
target.y += target_speed
if target.y > HEIGHT-50 or target.y < 50:
target_speed = -target_speed
if target.collide_pixel(boon): #2 boonに衝突したら
target.say("Hit", 2, size=70, color="red", y_offset=-70) #3 [Hit!」と 2秒間言う

セリフの位置(初期値)は、
(キャラクターのx座標, y座標-50)に しています。
x_offset, y_offsetを 記入しなければ
セリフは、この位置になります。

セリフを好きな場所へ移動させたい時に
x_offset, y_offset を使って、セリフの座標を決めてください

あれっ? 的が、セリフを言いながら動いてるよ

はい。これでもいいんだけれど、
お好みでセリフを言っている時、的の動きを止めたい場合は
is_talking( )メゾットと使おう

def target_move():
global target_speed
if not target.is_talking(): #4 もし 的が話していなければ
target.y += target_speed
if target.y > HEIGHT-50 or target.y < 50:
target_speed = -target_speed
if target.collide_pixel(boon):
target.say("Hit", 2, size=70, color="red", y_offset=-70)
if target.is_talking():
的が 話し中「True」

if not target.is_talking():
的が 話をしていないが「True」
not をつけると 「False」が 『True』に なります。


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

これで、的が 「Hit!」と言わない時だけ 動く。
つまり、
的が 「Hit!」と言っている間は 動かないんだ

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

今回は、
クリックしたらboonが動き 的に当たったら「Hit!」と言う
プログラムを作りました。
import pgzrun
from pgzhelper import *
from say import text_display
WIDTH = 800
HEIGHT = 590
boon = Actor("boon", (100, 300))
target = Actor("green_target", (700, 300))
boon_state = "ready"
target_speed = 5
def draw():
screen.fill("white")
boon.draw()
target.draw()
text_display.draw(screen)
def on_mouse_down(pos):
global boon_state
if boon.collidepoint_pixel(pos):
boon_state = "play"
def boon_move():
global boon_state
if boon_state == "play":
boon.x += 10
if boon.x > WIDTH:
boon.x = 100
boon_state = "ready"
def target_move():
global target_speed
if not target.is_talking():
target.y += target_speed
if target.y > HEIGHT-50 or target.y < 50:
target_speed = -target_speed
if target.collide_pixel(boon):
target.say("Hit", 2, size=70, color="red", y_offset=-70)
def update():
boon_move()
target_move()
pgzrun.go()


今回は、的当てゲームを作りました。
sayメゾットの使い方、覚えたかな
あなたのプログラムで 活用してみてください!

それじゃ、またね!