【Pygame Zero】簡単なゲーム19:ライトで透明なboonを探せ
こんにちは!
「Pythonしよう!楽しく学べるプログラミング教室」の
ラッチ先生です


スックです。よろしくね!
BGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「不気味な洋館」 written by のる
効果音提供:効果音ラボ
https://soundeffect-lab.info/
・ 「ピアノの単音」: 演出
・ 「小鼓(こつづみ)」: 演出

基礎プログラムと 画像を入れた
「簡単なゲーム19: かくれんぼ!」zipフォルダを
ダウンロードしてください



このゲームで使用している音声ファイルは、
以下のサイトからお借りしています。
各自でダウンロードして、該当するフォルダに入れてください!
BGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「不気味な洋館」 written by のる
効果音提供:効果音ラボ
https://soundeffect-lab.info/
・ 「ピアノの単音」: 演出
・ 「小鼓(こつづみ)」: 演出

学習の流れ
ライトを マウスで 動かす
3秒ごと ランダムな場所で出現する
ライトに触れたら 出現する
結果発表

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

今回の「かくれんぼ!」では、
・ライトと boonの当たり判定
・ boonが出現する場所を ランダムに決める
プログラムがあります。
そこで、2つのモジュールを 用意しました



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

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


ライトも 同じだよ
そして、属性(データ)やメソッド(命令)は、
『 . (ドット)』を付ければ、使えるよ
今回のプログラミングのポイント

今回のプログラミングのポイントが こちらです

set_alpha( )メソッドを使って、boonを見えるようにするよ
ライトを マウスで 動かす

変数result を 作成して
結果発表するまでは、ライトをマウスで動かすようにします
bg_image = "bg"
result = None #1 変数resultを宣言 初期値:None
def on_mouse_move(pos): #2 on_mouse_move関数を 定義する
if not result: #3 もし 変数resultに データが入っていなければ
light.pos = pos #4 ライトの座標に 引数pos:マウスの座標を 代入する
def update():- on_mouse_move関数 とは?


ライトが 動き出したね
3秒ごと ランダムな場所で出現する

次に、
boonをランダムに動かすboon_move関数を作成しましょう

result = None
def boon_move(): #1 boon_move関数を 定義する
if not result: #2 変数resultに データが入っていなければ
x = random.randint(50, WIDTH-50) #3 変数xに 50~750からランダムに選んだ数値を 代入する
y = random.randint(50, HEIGHT-50) #4 変数yに 50~550からランダムに選んだ数値を 代入する
boon.pos = x, y #5 boonの座標に、変数x, 変数yの数値を 代入する
clock.schedule(boon_move, 3) #6 3秒後にboon_move関数を実行する
boon_move() #7 boon_move関数を 実行する
def on_mouse_move(pos): 
boonも動いたよ
ライトに触れたら 出現する

まず、boon がライトに触れたら 動きが止まり、
ライトが離れたらboon が 動き出すプログラムを作りましょう

ライトが離れるとboonは すぐ違うところに 出現するね

boon に プロパティ:on を追加します。
ライトに触れたら、True。 触れてない時は、False。
そして、変数check_touch で
boon が ライトに触れたかどうか 判定してもらいます


- bool 型 とは?

★bool( )を使う理由★
collide_pixel( )メソッドは、
・ 触れたら その地点の座標(x, y)
・ 触れてなければ None
を 返します。変数check_touch に True か Falseが入るようにするため
bool()関数を使いました。
boon = Actor("boon", (400, 300))
boon.on = False #1 プロパティonに Falseを設定する
result = None
def boon_alpha(): #2 boon_alpha関数を 定義する
check_touch = bool(boon.collide_pixel(light)) #3 変数check_touchに 条件 ライトに触れるを 代入する
if check_touch != boon.on: #4 もし 変数check_touchが プロパティonと違ったら
boon.on = check_touch #5 プロパティonに 変数check_touchのデータを代入する
if boon.on: #6 もし プロパティonが Trueなら
clock.unschedule(boon_move) #7 boon_move関数を 止める
else: #8 その他
boon_move() #9 boon_move関数を 実行する
def boon_move(): def update():
boon_alpha() #10 boon_alpha関数を 実行する- unschedule( )メソッドとは?


変数check が変更したら プロパティon も変わるね

さあ、boonを透明にしていきましょう。
プロパティ: alpha を追加して、ここにアルファ値を入れます。
boon = Actor("boon", (400, 300))
boon.on = False
boon.alpha = 0 #1 プロパティalphaに 0を設定するdef boon_alpha():
check_touch = bool(boon.collide_pixel(light))
if check_touch != boon.on:
boon.on = check_touch
if boon.on:
clock.unschedule(boon_move)
else:
boon_move()
boon.alpha = 0 #5 プロパティalphaを 0にする
if boon.on: #2 もし プロパティonが Trueなら
boon.alpha = min(255, boon.alpha + 1) #3 プロパティalphaに 255と プロパティalphaに1ずつ増やす値の小さいほうを設定する
boon._surf.set_alpha(boon.alpha) #4 boonの画像のアルファ値を プロパティalpha値にする
def boon_move(): - min( )関数とは?


boonが 出現したね
結果発表


タイマーを 作ります。
30秒以内で boon を 見つけられたらクリアにします。

bg_image = "bg"
result = None
time = 30 #1 変数time 初期値30
def timer(): #2 timer関数を 定義する
global time #3 グローバル変数time
if not result: #4 もし 変数resultに データが入っていなければ
time -= 0.1 #5 変数timeを 0.1 ずつ減らす
time = round(time, 1) #6 変数timeを 小数第1位までの数値にする
clock.schedule_interval(timer, 0.1) #7 0.1秒ずつtimer関数を 実行するdef draw():
screen.blit(bg_image, (0, 0))
screen.draw.text(f"TIME: {time}",
(20, 20),
color="blue",
fontsize=70) #8 タイムを 表示する
boon.draw()
light.draw()- round() メソッドとは?

- schedule_interval() メソッドとは?

- text() メソッドとは?

- f 文字列 とは?


あらら…⁉ タイマーがマイナスになっちゃった…

大丈夫です。
あとでちゃんと「0」で止まるようにします。
それでは、set_result関数
クリアと ゲームオーバーのプログラムを 作成しましょう

time = 30
def set_result(result_val,
bg,
costume,
sound): #2 set_result関数を定義する
global result, bg_image #3 グローバル変数 result, bg_image
result = result_val #4 変数resultに 引数result_valを代入する
music.stop() #5 BGMを 止める
clock.unschedule(boon_move) #6 boon_move関数を 止める
boon.alpha = 255 #7 プロパティalphaを 255に設定する
bg_image = bg #8 変数bg_imageに 引数bgを代入する
boon.image = costume #9 プロパティimageに 引数costumeを代入する
sound.play() #10 引数soundを 再生する
def timer(): music.play("不気味な洋館") #1 BGMを流す
pgzrun.go()- 効果音について


効果音ラボサイトからの音源は、MP3形式です。
しかし、pygame zeroプログラムでは、MP3形式は使えません。WAV形式に 変換して フォルダsoundsに 入れてください
- music モジュールについて

- unschedule( )メソッドについて


それでは、set_result関数を使って
タイマーが 0 になったら ゲームオーバーにするプログラムを作ります
def timer():
global time
if not result:
time -= 0.1
time = round(time, 1)
if time < 0: #1 もし 変数timeが 0未満になったら
time = 0 #2 変数timeに 0 を設定する
set_result("over",
"bg_over",
"boon_over",
sounds.ピアノの単音) #3 set_result関数を 実行するBGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「不気味な洋館」 written by のる
効果音提供:効果音ラボ
https://soundeffect-lab.info/
・ 「ピアノの単音」: 演出

あそこに boonが いたのね

最後に、set_result関数を使って
ライトに当たって
プロパティalpha が 255になったらゲームクリアです
def timer():
global time
if not result:
time -= 0.1
time = round(time, 1)
if time < 0:
time = 0
set_result("over",
"bg_over",
"boon_over",
sounds.ピアノの単音)
elif boon.alpha == 255: #1 もし プロパティalphaが 255なら
set_result("clear",
"bg_clear",
"boon_clear",
sounds.小鼓) #2 set_result関数を 実行するBGM提供: DOVA-SYNDROME
https://dova-s.jp/
・ 「不気味な洋館」 written by のる
効果音提供:効果音ラボ
https://soundeffect-lab.info/
・ 「小鼓(こつづみ)」: 演出

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

今回は、
boon 画像の alpha 値を使った かくれんぼゲームを作りました。
import pgzrun
from pgzhelper import *
import random
WIDTH = 800
HEIGHT = 600
boon = Actor("boon", (400, 300))
boon.on = False
boon.alpha = 0
light = Actor("light", (100, 100))
bg_image = "bg"
result = None
time = 30
def set_result(result_val,
bg,
costume,
sound):
global result, bg_image
result = result_val
music.stop()
clock.unschedule(boon_move)
boon.alpha = 255
bg_image = bg
boon.image = costume
sound.play()
def timer():
global time
if not result:
time -= 0.1
time = round(time, 1)
if time < 0:
time = 0
set_result("over",
"bg_over",
"boon_over",
sounds.ピアノの単音)
elif boon.alpha == 255:
set_result("clear",
"bg_clear",
"boon_clear",
sounds.小鼓)
clock.schedule_interval(timer, 0.1)
def boon_alpha():
check_touch = bool(boon.collide_pixel(light))
if check_touch != boon.on:
boon.on = check_touch
if boon.on:
clock.unschedule(boon_move)
else:
boon_move()
boon.alpha = 0
if boon.on:
boon.alpha = min(255, boon.alpha + 1)
boon._surf.set_alpha(boon.alpha)
def boon_move():
if not result:
x = random.randint(50, WIDTH-50)
y = random.randint(50, HEIGHT-50)
boon.pos = x, y
clock.schedule(boon_move, 3)
boon_move()
def on_mouse_move(pos):
if not result:
light.pos = pos
def update():
boon_alpha()
def draw():
screen.blit(bg_image, (0, 0))
screen.draw.text(f"TIME: {time}",
(20, 20),
color="blue",
fontsize=70)
boon.draw()
light.draw()
music.play("不気味な洋館")
pgzrun.go()
set_alpha( )メソッドを使えば
キャラクター画像の 透明度が 変えることが できます

みなさんも、 かくれんぼゲームを作ってみよう!
それじゃあ、またね!











