見た目

【Pygame Zero】キャラクターのコスチュームを変えよう2

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

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

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

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

基礎プログラムと 画像を入れた
「見た目02 ブロック落とし」zipフォルダを ダウンロードしてください

pythonしよう!見た目02:ボーン・敵を表示する
pythonしよう!見た目02:ブロック落としzipの中身
スック
スック

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

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

ブロックをクリックして 落とす

コスチュームを変えながら 左右に動く

ブロックに当たると セリフを言う

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

ラッチ先生
ラッチ先生

今回の「ブロック落とし」ゲームでは、
・ ブロックを クリックする
boonボーンが セリフを言う
boonボーンが コスチュームを 変える
プログラムが あります

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

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

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

ラッチ先生
ラッチ先生

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

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

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

ラッチ先生
ラッチ先生

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

pythonしよう!見た目02:ポイント1:コスチュームの変え方の解説
スック
スック

コスチュームの範囲を 決められるよ

pythonしよう!見た目02:ポイント2:キャラクターごとにプログラムをまとめるの解説
スック
スック

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

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

ブロックを 2つの状態に 分けました

ラッチ先生
ラッチ先生

それでは、
ブロックのプログラムを 作りましょう

Python
block_state = "ready"                #1 変数block_state 初期値:"ready"
Python
def on_mouse_down(pos):              #2 クリックした座標(pos)を取得
    global block_state               #3 グローバル変数block_state

    if block.collidepoint_pixel(pos): #4 もし、ブロックをクリックしたら
        block_state = "fall"         #5 変数block_stateを "fall"にする

ポイント

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

blockブロック_moveムーヴ()関数で
blockブロック_stateステート が “fallフォール” になったら 下に落とすよ

Python
def block_move():              #1 ブロックの動きをまとめる
    global block_state         #2 グローバル変数 block_state

    if block_state == "fall":  #3 もし、変数block_stateが "fall"だったら
        block.y += 5           #4 ブロックのy座標を 5ずつ増やす

    if block.y > HEIGHT:       #5 もし、ブロックのy座標が スクリーンの高さ(590)より 大きくなったら
        block.y = 50           #6 ブロックのy座標を 50にする
        block_state = "ready"  #7 変数block_stateを "ready"にする
Python
def update():                  #8 更新する
    block_move()               #9 ブロックを動かす
スック
スック

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

ラッチ先生
ラッチ先生

まずは、boonを左右に動かしましょう

変数boonボーン_speedスピード を 作って、boonボーンの速度を入れます
初期値は「5」にして、5pxピクセルずつ動くようにします

Python
block_state = "ready" 
boon_speed = 5              #1 変数boon_speed 初期値:5
Python
def boon_move():            #2 boonの動きをまとめる
    global boon_speed       #3 グローバル変数 boon_speed 

    boon.x += boon_speed    #4 boonのx座標を 変数boon_speedずつ増やす

    if boon.x > WIDTH-50 or boon.x < 50: #5 もし、boonが左右の壁に当たったら
        boon_speed = -boon_speed       #6 -1 × 変数boon_speed
        boon.flip_x = not boon.flip_x  #7 boonの左右を反転する
Python
def update():    #8 更新する
    block_move() 
    boon_move()    #9 boonを動かす
pythonしよう!見た目02:属性flip_xの解説
ラッチ先生
ラッチ先生

次に、
animateアニメイト()メゾットで boonボーンのコスチュームを変えていくよ

スック
スック

3ステップで できちゃうよ!

Python
boon.images = ["boon", "blue_boon", "pink_boon", "purple_boon", "green_boon", "water_boon", "ouch_boon"]  #1 imagesに画像を入れる
boon.fps = 5        #2 1秒間に変える速さを入れる
Python
def boon_move():            
    global boon_speed       

    boon.x += boon_speed 
    boon.animate()  #3 コスチュームを変える
スック
スック

あれれ…⁉
boonボーンが、痛い顔をしているよ

pythonしよう!見た目02:ouchi_boon画像
ラッチ
ラッチ

おぅぅぅ…と 忘れてた!

boonボーンが左右に動いている時のコスチュームを
setセット_animationアニメーション_rangeレンジ( )メゾットで 範囲を決めよう

pythonしよう!見た目02:ポイント1コスチュームの変え方の解説
Python
def boon_move():            
    global boon_speed       

    boon.x += boon_speed 
    boon.set_animation_range(0, 5) #1 コスチュームの範囲:0~5
    boon.animate()  
スック
スック

おおお!できてる!

ラッチ先生
ラッチ先生

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

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

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

pythonしよう!見た目02:collide_pixel()メゾットの解説
Python
def draw():
    screen.fill("white")
    boon.draw()
    block.draw()
    text_display.draw(screen)  #1 テキスト表示装備を 準備する
Python
def boon_move():            
    global boon_speed       

    boon.x += boon_speed 
    boon.set_animation_range(0, 5) 
    boon.animate()  
    
    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

    if boon.collide_pixel(block):  #2 もし、ブロックに当たったら
        boon.image = "ouch_boon"   #3 コスチュームを ouch_boonにする
        boon.say("Ouch!", 2, size=70, color="red", y_offset=-70)  #4 boonが 「Ouch!」と2秒間言う
pythonしよう!見た目01:画像ouch_boon
スック
スック

あれれ! boonボーンの痛い顔が すぐなくなったよ

ラッチ
ラッチ

おおおっと!

isイズ_talkingトーキング( )メゾットを使って
boonボーンがセリフを 言っていない時に動くようにします

pythonしよう!見た目02:is_talking()メゾットの解説
スック
スック

44~55行 4文字分のインデント(右にずらす)してね

Python
def boon_move(): 
    global boon_speed 

    if not boon.is_talking():  #1 もし、boonが話していなければ
        boon.x += boon_speed   #2 ここから55行まで4文字分のインデントをします
        boon.set_animation_range(0, 5) 
        boon.animate() 

        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

        if boon.collide_pixel(block): 
            boon.image = "ouch_boon" 
            boon.say("Ouch!", 2, size=70, color="red", y_offset=-70) 
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
コスチュームを変えながら左右に動くboonボーンを当てるゲームの
プログラムを作りました。

ブロック落とし
Python
import pgzrun
from pgzhelper import *
from say import text_display
from costume import *

WIDTH = 800
HEIGHT = 590

boon = Actor("boon", (400, 500))
block = Actor("block", (400, 50))

block_state = "ready" 
boon_speed = 5 

boon.images = ["boon", "blue_boon", "pink_boon", "purple_boon", "green_boon", "water_boon", "ouch_boon"] 
boon.fps = 5

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

def on_mouse_down(pos): 
    global block_state 

    if block.collidepoint_pixel(pos): 
        block_state = "fall" 

def block_move(): 
    global block_state 

    if block_state == "fall": 
        block.y += 5 

    if block.y > HEIGHT: 
        block.y = 50 
        block_state = "ready" 

def boon_move(): 
    global boon_speed 

    if not boon.is_talking(): 
        boon.x += boon_speed 
        boon.set_animation_range(0, 5) 
        boon.animate() 

        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

        if boon.collide_pixel(block): 
            boon.image = "ouch_boon" 
            boon.say("Ouch!", 2, size=70, color="red", y_offset=-70) 

def update(): 
    block_move() 
    boon_move() 

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

コスチュームを次々と変えるアニメーションにする場合は、
costumeコスチュームモジュールをインポートして
3つのステップで プログラムを作れます

ラッチ先生
ラッチ先生

setセット_animationアニメーション_rangeレンジ( ) メゾットを使うと
使うコスチュームを 選べるよ

試してみてね!

pythonしよう!見た目02:set_animation_range()メゾットの解説
スック
スック

それじゃ、またね!

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

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

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