見た目

【Pygame Zero】キャラクターを透明にしてみよう

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

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

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

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

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

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

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

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

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

ランダムに選んだ場所へ移って 透明になる

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

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

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

ラッチ先生
ラッチ先生

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

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

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

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

ラッチ先生
ラッチ先生

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

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

これで、変数boonボーンに「 . (ドット)」を付ければ 使えるよ

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

だんだんと透明に なっていくよ

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

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

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

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

ラッチ先生
ラッチ先生

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

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_directionずつ 増やす

        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しよう!見た目04:update()関数の解説
スック
スック

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

ラッチ先生
ラッチ先生

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

pythonしよう!見た目04:on_mouse_down(pos)関数の解説
Python
def on_mouse_down(pos):   #1 マウスがクリックしたpos(座標)を取得する
    global arrow_state    #2 グローバル変数: arrow_state

    if arrow.collidepoint_pixel(pos):  #3 矢印をクリックしたならば
        arrow_state = "fly"            #4  変数arrow_stateに flyを 代入する

ポイント

pythonしよう!見た目04: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"を 代入する 
スック
スック

飛んだ!飛んだ!

ラッチ先生
ラッチ先生

boonボーンを透明にするため
VisualEffectビジュアルエフェクト( )を使います

Python
boon = VisualEffect("boon", (400, 300)) #1 変数boonに ビジュアルエフェクトクス(設計図)で作るboonを 代入します。
Python
def draw():
    screen.fill("white")
    boon.draw(screen)   #2 スクリーンに boonを 表示する
    arrow.draw()
pythonしよう!見た目04:ポイント1の解説
ラッチ先生
ラッチ先生

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

pythonしよう!見た目04:randint()関数の解説
Python
boon_state = "move"      #1 変数boon_stateに "move(動く)を代入する
Python
def boon_move():         #2 boonの動きを まとめる
    global boon_state    #3 グローバル変数 boon_state

    if boon_state == "move":  #4 もし、変数boon_stateが "move"だったら
        while True:           #5 繰り返す
            boon.x = random.randint(50, WIDTH-50)  #6 boonのx座標を 50~750から ランダムに選んで代入する
            boon.y = random.randint(50, HEIGHT-50) #7 boonのy座標を 50~540から ランダムに選んで代入する
            if not boon.collide_pixel(arrow):  #8 もし、boonが 矢印に触れてなければ
                boon_state = "fading"  #9 変数boon_stateに "fading(消えていく)" を代入する
                break                  #10 繰り返しから 外れる
pythonしよう!見た目04:while文の解説
ラッチ先生
ラッチ先生

alphaアルファー_animationアニメーション( ) メゾットを使って
boonボーンが透明になっていくアニメーションにします

pythonしよう!見た目04:ポイント2の解説
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): 
                boon.reset_effects()  #6 ③リセットする
                boon_state = "fading" 
                break
            
    elif boon_state == "fading":   #1 変数boon_stateが fading(消えていく) なら
        boon.alpha_animation()     #2 ①透明アニメーションを 開始する
        result = boon.process_animation()  #3 ②実行する
        if result == "finished":   #4 もし、アニメーションが 終わったら    
            boon_state = "move"    #5 変数boon_stateに "move"を代入する  
pythonしよう!見た目04:alpha_animation()メゾットの解説
pythonしよう!見た目04:process_animation()メゾットの解説
ラッチ先生
ラッチ先生

透明になるアニメーションの速さを変えたい場合は、
2つのプロパティを使って調整できます。

スック
スック

透明の増加量で 透明になっていく時間を変えられるよ

ラッチ先生
ラッチ先生

今回は、以下の設定で 透明のアニメーションにしました。

Python
boon.animation_speed = 3 #1 boonのアニメーションのスピードを 3 にする
boon.alpha_increment = 8 #2 boonの透明の増加量を 8 にする
スック
スック

みんなも いろいろ試してみてね

pythonしよう!見た目04:矢印に当たるとセリフを言う
ラッチ先生
ラッチ先生

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

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

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

pythonしよう!見た目04:collide_pixel()メゾットの解説
Python
def draw():
    screen.fill("white")
    boon.draw(screen)
    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): 
                boon.reset_effects() 
                boon_state = "fading" 
                break
            
    elif boon_state == "fading": 
        boon.alpha_animation() 
        result = boon.process_animation()
        if result == "finished":      
            boon_state = "move"
            
        if boon.collide_pixel(arrow): #2 boonが 矢印に触れたら
            boon_state = "hit"        #3 変数boo_stateに "hit"を代入する
            boon.reset_effects()      #4 boonをリセットする
            boon.image = "ouch_boon"  #5 画像を"ouch_boon"にする 
            boon.say("Ouch!", 2, color="red", size=70, y_offset=-70)     #6 「Ouch!」と2秒間言う           
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
ランダムに選んだ場所で 透明になっていくboonボーンを 当てるゲームの
プログラムを作りました。

boonを ねらえ!No.2
Python
import pgzrun
from pgzhelper import *
from say import text_display
from visual import VisualEffect
import random

WIDTH = 800
HEIGHT = 590

boon = VisualEffect("boon", (400, 300)) 
arrow = Actor("arrow", (100, 500))

arrow_state = "rotate" 
arrow_direction = 1 
boon_state = "move" 

boon.animation_speed = 3
boon.alpha_increment = 8

def draw():
    screen.fill("white")
    boon.draw(screen)
    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(30)
        
        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): 
                boon.reset_effects() 
                boon_state = "fading" 
                break
            
    elif boon_state == "fading": 
        boon.alpha_animation() 
        result = boon.process_animation()
        if result == "finished":      
            boon_state = "move"
            
        if boon.collide_pixel(arrow): 
            boon_state = "hit"
            boon.reset_effects() 
            boon.image = "ouch_boon" 
            boon.say("Ouch!", 2, color="red", size=70, y_offset=-70)               

def on_mouse_down(pos): 
    global arrow_state 

    if arrow.collidepoint_pixel(pos): 
        arrow_state = "fly"
        
def update(): 
    arrow_move() 
    boon_move()
    
pgzrun.go()
ラッチ先生
ラッチ先生

キャラクターの見た目を 変えるVisualEffectビジュアルエフェクト( )を使って、
boonボーンを 透明にするプログラムを作りました。

pythonしよう!見た目04:visualモジュールの解説
ラッチ先生
ラッチ先生

キャラクターを透明にするプログラムを作る手順です。

pythonしよう!見た目04:ポイント1の解説
pythonしよう!見た目04:ポイント2の解説
ラッチ先生
ラッチ先生

透明になるアニメーションの変更は、
この2つのプロパティで 行おう

スック
スック

みんなも試してみてね
それじゃ、またね!

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

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

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