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

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


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

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



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

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

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

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





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

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


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


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


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


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

それでは、
矢印のプログラムを 作りましょう
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_directionずつ 増やす
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.collidepoint_pixel(pos): #3 矢印をクリックしたならば
arrow_state = "fly" #4 変数arrow_stateに flyを 代入する
ポイント
collidepoint_pixel(pos) メゾットで、
矢印が クリックされたか 判定されます。

73. if 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"を 代入する

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

boonを透明にするため
VisualEffect( )を使います
boon = VisualEffect("boon", (400, 300)) #1 変数boonに ビジュアルエフェクトクス(設計図)で作るboonを 代入します。
def draw():
screen.fill("white")
boon.draw(screen) #2 スクリーンに boonを 表示する
arrow.draw()


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

boon_state = "move" #1 変数boon_stateに "move(動く)を代入する
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 繰り返しから 外れる
ポイント
49. While True:
boon.x = random.randint(50, WIDTH-50)
boon.y = random.randint(50, HEIGHT-50)
boonが ランダムに選んだ場所が 矢印に触れた場合
そこで、終わってしまいます。
While文を 使って 矢印触れない場所になるまで 繰り返します。


alpha_animation( ) メゾットを使って
boonが透明になっていくアニメーションにします

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"を代入する
ポイント
58. boon.alpha_animation( )
まず、 透明のアニメーションを設定し 開始します

59. result = boon.process_animation()
これで、透明のアニメーションが 実行します。

このprocess_animation()メゾットは、返り値があるので
変数result(結果)の 中に 代入します。
60. if result == “finished“:
変数result の中に “finished“が 入ったら アニメーション終了です

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

透明の増加量で 透明になっていく時間を変えられるよ
ポイント
animation_speed(アニメーションのスピード)
フレーム数で 透明になっていく時間を変えます
def update( ) 関数では、1秒間に約60フレーム更新されます。
・ animation_speed = 1 : 毎回 アニメーション更新
・ animation_speed = 5 : 5フレームごと アニメーション更新
・ animation_speed = 10: 10フレームごと アニメーション更新

今回は、以下の設定で 透明のアニメーションにしました。
boon.animation_speed = 3 #1 boonのアニメーションのスピードを 3 にする
boon.alpha_increment = 8 #2 boonの透明の増加量を 8 にする

みんなも いろいろ試してみてね
矢印に 当たると セリフを言う


最後に、
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(screen)
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):
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を 当てるゲームの
プログラムを作りました。
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を 透明にするプログラムを作りました。


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



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

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