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

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


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

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



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

学習の流れ
ボーンを マウスで 動かす
敵が コスチュームを変えながら 追ってくる
敵に捕まると セリフを言う
プログラムを 実行してみよう
プログラミングの仕方を説明します
モジュールを 用意する

今回の「敵から 逃げろ!No.2」ゲームでは、
・ boonが セリフを言う
・ 敵が コスチュームを 変える
プログラムが あります
そこで、2つのモジュールを 用意しました


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

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


わぁ~!いっぱい入っているね
『 . (ドット)』を付ければ、使えるよ
boonを マウスで 動かす

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

この3つのステップで
コスチュームを変えることができるよ


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

それでは、
boonを マウスで動かすプログラムを 作りましょう
boon_state = "escape" #1 変数boon_state 初期値:"escape"
def on_mouse_move(pos): #2 動いているマウスの座標を 取得
global boon_state #3 グローバル変数boon_state
mouse.pos = pos
if boon_state == "escape": #4 もし、変数boon_stateが "escape"だったら
boon.pos = pos #5 マウスの座標を boonの座標に入れる
ポイント
2. on_mouse_move(pos)関数で、
動いているマウスの座標を引数posの中に 入れます

pos は、
position(位置)の 略語だよ
敵が コスチュームを変えながら 追いかけてくる

mouseオブジェクトを使って
敵が マウスを追いかけるように プログラムします。

mouse.pos = 400, 300 #1 属性posを追加 初期化:座標(400, 300)
def on_mouse_move(pos):
global boon_state
mouse.pos = pos #2 動いているマウスの座標を マウスのposに入れる
if boon_state == "escape":
boon.pos = pos
def enemy_move(): #3 敵の動きをまとめる
enemy.angle = enemy.angle_to(mouse.pos) #4 マウスの方を 向ける
enemy.move_forward(5) #5 敵を5pxずつ動かす
def update(): #6 更新する
enemy_move() #7 敵を 動かす
ポイント 1
13. mouse.pos = 400, 300
mouseオブジェクトに「pos」と言う属性を新たに追加しました。
ポイント 2
39. enemy.angle = enemy.angle_to(mouse.pos)
angle_to( ) メゾットを使って、マウスの方へ向ける


次は、敵のコスチュームを 変えていくよ
enemy.images = ["purple_enemy", "green_enemy", "red_enemy", "yellow_enemy", "blue_enemy"] #1 リストに 画像を入れる
enemy.fps = 7 #2 1秒間に7回切り替える
def enemy_move():
enemy.angle = enemy.angle_to(mouse.pos)
enemy.move_forward(5)
enemy.animate() #3 コスチュームを変える

簡単に できちゃうんだね
敵に 捕まると セリフを言う

最後に、
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()
enemy.draw()
text_display.draw(screen) #1 テキスト表示装備を 準備する
def on_mouse_move(pos):
global boon_state
mouse.pos = pos
if boon_state == "escape":
boon.pos = pos
if boon.collide_pixel(enemy): #2 もし、敵に 触れたら
boon_state = "catch" #3 変数boon_stateを ”catch"にする
boon.image = "ouch_boon" #4 boonの画像を "ouch_boon"にする
boon.say("Ouch", 2, size=70, color="red", y_offset=-70) #5 [Ouch!」と2秒間 言う
ポイント
34. boon.image = “ouch_boon“

ouch_boon.png
Actor()クラスの属性image に、見せたい画像を入れるだけで
boonのコスチュームが 変わります

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

今回は、
コスチュームを変えながら追ってくる敵から逃げるゲームの
プログラムを作りました。
import pgzrun
from pgzhelper import *
from say import text_display
from costume import *
WIDTH = 800
HEIGHT = 590
boon = Actor("boon", (400, 300))
enemy = Actor("purple_enemy", (700, 100))
boon_state = "escape"
mouse.pos = 400, 300
enemy.images = ["purple_enemy", "green_enemy", "red_enemy", "yellow_enemy", "blue_enemy"]
enemy.fps = 7
def draw():
screen.fill("white")
boon.draw()
enemy.draw()
text_display.draw(screen)
def on_mouse_move(pos):
global boon_state
mouse.pos = pos
if boon_state == "escape":
boon.pos = pos
if boon.collide_pixel(enemy):
boon_state = "catch"
boon.image = "ouch_boon"
boon.say("Ouch", 2, size=70, color="red", y_offset=-70)
def enemy_move():
enemy.angle = enemy.angle_to(mouse.pos)
enemy.move_forward(5)
enemy.animate()
def update():
enemy_move()
pgzrun.go()

コスチュームを変えたければ
Actor()クラスの属性imageに 画像を いれよう
コスチュームを次々と変えるアニメーションにする場合は、
costumeモジュールをインポートして
3つのステップで プログラムを作っていこう
試してみてね!

それじゃ、またね!