【Pygame Zero】コスチュームの大きさを変えよう

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


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

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



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

学習の流れ
回転する矢印を クリックすると 飛ぶ
ランダムに選んだ場所へ移って 拡大する
矢印に当たると セリフを言う

プログラムを 実行してみよう
プログラミングの仕方を説明します
モジュールを 用意する

今回の「boonを ねらえ!」ゲームでは、
・ 矢印が 飛び出す
・ boonが ランダムな場所へ 移る
・ boonが セリフを言う
プログラムが あります
そこで、3つのモジュールを 用意しました




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

Actor()クラスが入っている変数boonには、
boonを動かす属性(データ)やメゾット(命令)が あります。


わぁ~!いっぱい入っているね
『 . (ドット)』を付ければ、使えるよ
今回のプログラミングのポイント

今回のプログラミングには、ポイントが 3つあります


これで、大きさを決められるんだね


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


矢印は、2つ。boonは3つに 分けたよ
回転する矢印を クリックすると 飛ぶ

それでは、
矢印のプログラムを 作りましょう
arrow_state = "rotate" #1 変数arrow_state 初期値:"rotate(回転)"
arrow_direction = 1 #2 変数arrow_direction(方向) 初期値: 1
def arrow_move(): #3 矢印の動きを まとめる
global arrow_state, arrow_direction #4 グローバル変数:arrow_state, arrow_direction
if arrow_state == "rotate": #5 変数arrow_stateが 回転なら
arrow.angle += arrow_direction #6 矢印の向きを 変数arrow_direct ion増やす
if arrow.angle > 90 or arrow.angle < 0: #7 もし、矢印の向きが 90度より大きい または、0度より低い なら
arrow_direction = -arrow_direction #8 変数arrow_directionに -1×arrow_directionを代入する
def update(): #9 更新する
arrow_move() #10 矢印を 動かす


update()関数に
arrow_move() 関数を 入れることによって 矢印が 動くからね

次は、
def on_mouse_down(pos) 関数を使って、
矢印を クリックしたら 飛ぶようにします

def on_mouse_down(pos): #1 マウスがクリックしたpos(座標)を取得する
global arrow_state #2 グローバル変数: arrow_state
if arrow_state == "rotate" and arrow.collidepoint_pixel(pos): #3 もし、変数arrow_stateが rotate で かつ 矢印をクリックしたならば
arrow_state = "fly" #4 変数arrow_stateに flyを 代入する
ポイント
collidepoint_pixel(pos) メゾットで、
矢印が クリックされたか 判定されます。

27. if ・・・ and arrow.collidepoint_pixel(pos):
if 文では、
arrow.collidepoint_pixel(pos) が 「1」になると 『True』になります

arrow_move()関数で
変数arrow_state が “fly“になったら 飛ばすよ
def arrow_move():
global arrow_state, arrow_direction
if arrow_state == "rotate":
arrow.angle += arrow_direction
if arrow.angle > 90 or arrow.angle < 0:
arrow_direction = -arrow_direction
if arrow_state == "fly": #1 もし、変数arrow_stateが、"fly"になったら
arrow.move_forward(20) #2 20pxずつ 動く
if arrow.x > WIDTH or arrow.y < 0: #3 端に当たったら
arrow.pos = 100, 500 #4 矢印の座標に X:100 y:500 を代入する
arrow_state = "rotate" #5 変数arrow_stateに "rotate"を 代入する

飛んだ!飛んだ!
ランダムに選んだ場所へ移って 拡大する

randint()メゾットを使って、
boonを ランダムに選んだ場所へ 移動させて拡大させよう

def boon_move(): #1 boonの動きをまとめる
global boon_state #2 グローバル変数boon_state
if boon_state == "move": #3 もし、変数boon_stateが "move"だったら
boon.x = random.randint(50, WIDTH-50) #4 boonのx座標に 50~ 750の中の数字から ランダムに選んで 代入する
boon.y = random.randint(50, HEIGHT-50) #5 boonのy座標に 50~ 540の中の数字から ランダムに選んで 代入する
boon.scale = 0.1 #6 boonの大きさを 0.1にする
boon_state = "expand" #7 変数boon_stateに "expand(拡大)"を 代入する
if boon_state == "expand": #8 もし、変数boon_stateが "expand(拡大)だったら
boon.scale += 0.01 #9 boonの大きさを 0.01ずつ増やす
if boon.scale >= 1.3: #10 もし、boonの大きさが 1.3以上になったら
boon_state = "move" #11 変数boon_stateに "move"を代入する
def update():
arrow_move()
boon_move() #12 boonを 動かす
ポイント
Actor()クラスに プロパティ『scale』があります。

47. boon.scale += 0.01
boonの大きさを 0.01ずつ 大きくします。

あれれ…⁉。矢印に当たっているよ

おぅぅぅ…と!
ゲームを始める前に 終わっちゃうね・・・
While文を使って
矢印に触れない場所に 決まるまで 繰り返そう

def boon_move():
global boon_state
if boon_state == "move":
while True: #1 boonの場所をランダムに 決めるのを繰り返す
boon.x = random.randint(50, WIDTH-50)
boon.y = random.randint(50, HEIGHT-50)
if not boon.collide_pixel(arrow): #2 矢印に 触れてなければ
break #3 繰り返しを やめる
boon.scale = 0.1
boon_state = "expand"

これで、矢印に触れることなく
ランダムに選んだ場所へ 移ることができます

矢印に当たったら、どこかへ行ってるね
矢印に 当たったら セリフを言う


最後に、
sayモジュールのtext_displayオブジェクトを使って
boonに セリフを 言わせよう

★ text_displayオブジェクトの 使い方 ★
1. text_display.draw(screen)
これで、スクリーンに セリフを 表示させることができます
2. boon.say(“Ouch!”, 2, size=70, color=”red”, y_offset= -70)
sayメゾットを使って、boonにセリフを 言わせます。


矢印との衝突判定は、
collide_pixel( ) メゾットを 使ったよ

def draw():
screen.fill("white")
boon.draw()
arrow.draw()
text_display.draw(screen) #1 テキスト表示装備を 準備する
def boon_move():
global boon_state
if boon_state == "move":
while True:
boon.x = random.randint(50, WIDTH-50)
boon.y = random.randint(50, HEIGHT-50)
if not boon.collide_pixel(arrow):
break
boon.scale = 0.1
boon_state = "expand"
if boon_state == "expand":
boon.scale += 0.01
if boon.scale >= 1.3:
boon_state = "move"
if boon.collide_pixel(arrow): #2 矢印に 触れたら
boon_state = "hit" #3 変数boon_stateに "hit"を代入する
boon.image = "ouch_boon" #4 boonの画像を "ouch_boon"にする
boon.say("Ouch!", 2, size=70, color="red", y_offset =-70) #5 「Ouch!」と 2秒間言う

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

今回は、
ランダムに選んだ場所で 拡大していくboonを 当てるゲームの
プログラムを作りました。
import pgzrun
from pgzhelper import *
import random
from say import text_display
WIDTH = 800
HEIGHT = 590
boon = Actor("boon", (400, 300))
arrow = Actor("arrow", (100, 500))
arrow_state = "rotate"
arrow_direction = 1
boon_state = "move"
def draw():
screen.fill("white")
boon.draw()
arrow.draw()
text_display.draw(screen)
def arrow_move():
global arrow_state, arrow_direction
if arrow_state == "rotate":
arrow.angle += arrow_direction
if arrow.angle > 90 or arrow.angle < 0:
arrow_direction = -arrow_direction
if arrow_state == "fly":
arrow.move_forward(20)
if arrow.x > WIDTH or arrow.y < 0:
arrow.pos = 100, 500
arrow_state = "rotate"
def boon_move():
global boon_state
if boon_state == "move":
while True:
boon.x = random.randint(50, WIDTH-50)
boon.y = random.randint(50, HEIGHT-50)
if not boon.collide_pixel(arrow):
break
boon.scale = 0.1
boon_state = "expand"
if boon_state == "expand":
boon.scale += 0.01
if boon.scale >= 1.3:
boon_state = "move"
if boon.collide_pixel(arrow):
boon_state = "hit"
boon.image = "ouch_boon"
boon.say("Ouch!", 2, size=70, color="red", y_offset =-70)
def on_mouse_down(pos):
global arrow_state
if arrow_state == "rotate" and arrow.collidepoint_pixel(pos):
arrow_state = "fly"
def update():
arrow_move()
boon_move()
pgzrun.go()

キャラクターの大きさは、
Actorクラスの プロパティ「scale」で 簡単に変えられます。
みんなも試してみてね


それじゃ、またね!