見た目

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

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

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

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

今回のプロジェクトには、
boonボーンの他に 矢印が 登場します。

基礎プログラムと 画像を入れた
「見た目03 boonボーンを ねらえ!」zipフォルダを ダウンロードしてください

pythonしよう!見た目03:ボーン・矢印を表示する
pythonしよう!見た目03:boonをねらえ!zipの中身
スック
スック

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

参考記事
【Pygame Zero】スクリーンに画像を 表示させる
【Pygame Zero】スクリーンに画像を 表示させる
スポンサーリンク

回転する矢印を クリックすると 飛ぶ

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

矢印に当たると セリフを言う

pythonしよう!見た目03:矢印に当たるとセリフを言う

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

ラッチ先生
ラッチ先生

今回の「boonボーンを ねらえ!」ゲームでは、
・ 矢印が 飛び出す
boonボーンが ランダムな場所へ 移る
boonボーンが セリフを言う
プログラムが あります

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

pythonしよう!見た目03:pgzhelperの解説
pythonしよう!見た目03:randomモジュールの解説
pythonしよう!見た目03:sayモジュールの解説
スック
スック

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

ラッチ先生
ラッチ先生

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

pythonしよう!見た目03:変数boonの解説
スック
スック

わぁ~!いっぱい入っているね
『 . (ドット)』を付ければ、使えるよ

ラッチ先生
ラッチ先生

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

pythonしよう!見た目03:ポイント1の解説
スック
スック

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

pythonしよう!見た目03:ポイント2の解説
スック
スック

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

pythonしよう!見た目03:ポイント3の解説
スック
スック

矢印は、2つ。boonボーンは3つに 分けたよ

ラッチ先生
ラッチ先生

それでは、
矢印のプログラムを 作りましょう

Python
arrow_state = "rotate"  #1 変数arrow_state 初期値:"rotate(回転)"
arrow_direction = 1     #2 変数arrow_direction(方向) 初期値: 1
Python
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を代入する
Python
def update():     #9 更新する
    arrow_move()  #10 矢印を 動かす
pythonしよう!見た目03:update関数の解説
スック
スック

updateアップデート()関数に
arrowアロー_moveムーヴ() 関数を 入れることによって 矢印が 動くからね

ラッチ先生
ラッチ先生

次は、
defデフ onオン_mouseマウス_downダウン(posポス) 関数を使って、
矢印を クリックしたら 飛ぶようにします

pythonしよう!見た目03:def on_mouse_down()関数の解説
Python
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を 代入する

ポイント

pythonしよう!見た目03:collidepoint_pixel()メゾットの解説
ラッチ先生
ラッチ先生

arrowアロー_moveムーヴ()関数で
変数arrowアロー_stateステート が “flyフライ“になったら 飛ばすよ

Python
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ボーンを ランダムに選んだ場所へ 移動させて拡大させよう

pythonしよう!見た目03:randint()関数の解説
Python
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"を代入する
Python
def update(): 
    arrow_move() 
    boon_move()     #12 boonを 動かす

ポイント

Actorアクター()クラスに プロパティ『scaleスケール』があります。

pythonしよう!見た目03:Actor()クラスのプロパティscaleの解説

47. boonボーン.scaleスケール += 0.01
boonボーンの大きさを 0.01ずつ 大きくします。

スック
スック

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

ラッチ
ラッチ

おぅぅぅ…と!
ゲームを始める前に 終わっちゃうね・・・

Whileホワイル文を使って
矢印に触れない場所に 決まるまで 繰り返そう

pythonしよう!見た目03:While文の解説
Python
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" 
ラッチ先生
ラッチ先生

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

スック
スック

矢印に当たったら、どこかへ行ってるね

pythonしよう!見た目03:ランダムな場所へ移って拡大する
ラッチ先生
ラッチ先生

最後に、
sayセイモジュールのtextテキスト_displayディスプレイオブジェクトを使って
boonボーンに セリフを 言わせよう

pythonしよう!見た目03:sayモジュールの解説
pythonしよう!見た目03:say()メゾットの解説
スック
スック

矢印との衝突判定は、
collideコライド_pixelピクセル( ) メゾットを 使ったよ

pythonしよう!見た目03:collide_pixel()メゾットの解説
Python
def draw():
    screen.fill("white")
    boon.draw()
    arrow.draw()
    text_display.draw(screen) #1 テキスト表示装備を 準備する
Python
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ボーンを 当てるゲームの
プログラムを作りました。

boonを ねらえ!
Python
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スケール」で 簡単に変えられます。

みんなも試してみてね

pythonしよう!見た目03:Actor()クラスのプロパティscaleの解説
スック
スック

それじゃ、またね!

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

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

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