【Pygame Zero】敵から逃げるゲームを作ろう

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


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

今回のプロジェクトには、
boonの他に 紫色の敵が 登場します。
紫色の敵の画像と基礎プログラムを入れた
「動き2-4 敵から逃げろ!」zipフォルダを ダウンロードしてください



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

学習の流れ
プログラミングの仕方を説明します
sayモジュールを 用意する

敵が 斜めに動く

今回の「敵から 逃げろ!」ゲームのプログラムを作る上で
ポイントが 2つあります


これで、
敵に当たると boonの動きが 止まるようにしました。


今回は、3つの状態に 分けました

それでは、
敵の角度を60°にして 動き続けるプログラムを 作りましょう
変数enemyには、Actor()クラス(設計図)が 入っていて
enemyを動かす属性やメゾットが たくさん入っています

変数enemy に、「 . (ドット)」を属性やメゾットを 使いましょう
boon_state = "look" #1 変数boon_state 初期値:"look"
boon_animation = None #2 変数boon_animation 初期値:None(なし)
enemy.angle = 60 #3 敵の角度 60° 代入する
def enemy_move(): #4 敵の動きをまとめる
global boon_state #5 グローバル変数boon_state
enemy.move_forward(10) #6 敵を 動かす
if enemy.x > WIDTH-50 or enemy.x < 50: #7 もし、左右の端に触れたら
enemy.angle = 180-enemy.angle #8 跳ね返る角度を 敵の向きに 代入する
if enemy.y > HEIGHT-50 or enemy.y < 50: #9 もし、上下の端に触れたら
enemy.angle = -enemy.angle #10 跳ね返る角度を 敵の向きに 代入する
def update(): #11 更新する関数
enemy_move() #12 敵を 動かす
ポイント1
12. boon_animation = None
変数boon_animation は、
animate()関数で 作った インスタンス(boonが動くプログラム)を 入れるもの。
だから、最初は、空(None)に しておく
ポイント2
○跳ね返りの角度
27. enemy.angle = 180-enemy.angle
29. enemy.angle = –enemy.angle


enemy_move()関数に 敵の動きのプログラムをまとめただけでは、敵は 動かないよ
update()関数の中に 入れて、更新させてね
クリックした地点へ 1秒かけて行く

on_mouse_move関数を使って、
boonが マウスの方へ向く プログラムを 作りましょう
def draw():
screen.fill("white")
boon.draw()
enemy.draw()
text_display.draw(screen) #1 テキスト表示装備を準備する
def on_mouse_move(pos): #2 動いてるマウスの座標posを 取得する
global boon_state #3 グローバル変数boon_state
if boon_state == "look": #4 もし、boon_stateが "look"なら
boon.angle = boon.angle_to(pos) #5 マウスの座標へ向く
boon.say("Hmm...", size= 70, color = "blue") #6 「Hmm...」と言う
ポイント1
40. on_mouse_move(pos)関数で、
動いているマウスの座標posを取得して
44. angle_to(pos)メゾットで、boonのマウスへ向く角度を 計算させます

ポイント2
19. text_display.draw(screen)
これで、スクリーンに セリフを 表示させることができます
45. boon.say(“Hmm…”, size=70, color=”blue“)
sayメゾットを使って、boonにセリフを 言わせます。


sayメゾットでは、
秒数を書かなければ、いつまでもセリフは表示されるよ

そして、
on_mouse_down(pos)関数で、
クリックした場所へ 1秒かけて 動かします。
animate()関数を 使うよ

def on_mouse_down(pos): #1 クリックした座標を取得する
global boon_animation, boon_state #2 グローバル変数boon_animation, boon_state
if boon_state == "look": #3 もし、変数boon_stateが "look"なら
boon_state = "escape" #4 "escape"を 代入する
boon_animation = animate(boon, pos=pos, duration=1.0, on_finished=boon_look) #5 boonを1秒かけて クリックした座標へ動かす
boon.clear_text() #6 boonのセリフを消す
def boon_look(): #7 boon_look()関数:アニメーションが終了した時
global boon_state #8 グローバル変数 boon_state
boon_state = "look" #9 変数boon_stateに "look"を代入する
ポイント1
52. animate(boon, pos=pos, duration=1.0, on_finished=boon_look)
boonのアニメーションが終了した時の動きを ○関数にまとめて
on_finished = ○ と 書きます。
ここでは、boon_stateを “look“に 変えて
boonが、マウスの方を向くようにしたかったため
55. boon_look()関数を 作ったよ


これで、
boonが敵に逃げるプログラムが 終わったよ
敵に当たったら セリフを言う

さあ、最後のプログラムです。
敵に 捕まったら boonの動きを止めて セリフを 言わせましょう
ポイント1
31. if enemy.collide_pixel(boon)
collide_pixel()メゾットを 使って、衝突判定をしてもらう

def enemy_move():
global boon_state
enemy.move_forward(10)
if enemy.x > WIDTH-50 or enemy.x < 50:
enemy.angle = 180-enemy.angle
if enemy.y > HEIGHT-50 or enemy.y < 50:
enemy.angle = -enemy.angle
if enemy.collide_pixel(boon): #1 もし、boonに当たったら
if boon_state == "escape": #2 もし、変数boon_stateが "escape"だったら
boon_animation.stop() #3 boonのアニメーションを止める
boon_state = "catch" #4 変数boon_stateに"catch"を 代入する
boon.say("Ouch!", 2, size=70, color="red", y_offset=-70) #5 「Ouch!」と2秒間言う

あれっ? boonの動きが止まっているのに
敵に当たると 「Ouch!」と 言うよ

おぉぉぉ…と! ほんとだ
こういう場合は、boon_state != “catch” を つけくわえよう
「!=」は、比較演算子で『等しくない』時に True となります。
if enemy.collide_pixel(boon) and boon_state != "catch":

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

今回は、
敵から クリックして逃げるゲームのプログラムを作りました。
import pgzrun
from pgzhelper import *
from say import text_display
WIDTH = 800
HEIGHT = 590
boon = Actor("boon", (400, 100))
enemy = Actor("purple_target", (400, 500))
boon_state = "look"
enemy.angle = 30
boon_animation = None
def draw():
screen.fill("white")
boon.draw()
enemy.draw()
text_display.draw(screen)
def enemy_move():
global boon_state
enemy.move_forward(10)
if enemy.x > WIDTH-50 or enemy.x < 50:
enemy.angle = 180-enemy.angle
if enemy.y > HEIGHT-50 or enemy.y < 50:
enemy.angle = -enemy.angle
if enemy.collide_pixel(boon) and boon_state != "catch":
if boon_state == "escape":
boon_animation.stop()
boon_state = "catch"
boon.say("Ouch!", 2, size=70, color="red", y_offset=-70)
def update():
enemy_move()
def on_mouse_move(pos):
global boon_state
if boon_state == "look":
boon.angle = boon.angle_to(pos)
boon.say("Hmm...", size= 70, color = "blue")
def on_mouse_down(pos):
global boon_animation, boon_state
if boon_state == "look":
boon_state = "escape"
boon_animation = animate(boon, pos=pos, duration=1.0, on_finished=boon_look)
boon.clear_text()
def boon_look():
global boon_state
boon_state = "look"
pgzrun.go()


animate()関数で作ったプログラムを
変数に代入すれば、アニメーションを操作することができる
これは、とても便利だから覚えておこうね


それじゃ、またね!