動き2

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

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

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

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

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

紫色の敵の画像と基礎プログラムを入れた
「動き2-4 敵から逃げろ!」zipフォルダを ダウンロードしてください

pythonしよう!動き2-4:ボーン・敵を表示する
pythonしよう!動き2-4:敵から逃げろ!.zipの中身
スック
スック

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

参考記事
【Pygame Zero】スクリーンに画像を 表示させる
【Pygame Zero】スクリーンに画像を 表示させる
スポンサーリンク
コードを 書こう
敵を 斜めに動かす
クリックした所へ1秒かけて 動く
敵に当たったら セリフを 2秒間 言う
プログラムを 実行してみよう
pythonしよう!動き2-4:sayモジュールの解説
ラッチ先生
ラッチ先生

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

スック
スック

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

スック
スック

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

ラッチ先生
ラッチ先生

それでは、
敵の角度を60°にして 動き続けるプログラムを 作りましょう

Python
boon_state = "look"   #1 変数boon_state 初期値:"look"
boon_animation = None #2 変数boon_animation 初期値:None(なし)
enemy.angle = 60      #3 敵の角度 60° 代入する
Python
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 敵を 動かす
スック
スック

enemyエネミー_moveムーヴ()関数に 敵の動きのプログラムをまとめただけでは、敵は 動かないよ
updateアップデート()関数の中に 入れて、更新させてね

ラッチ先生
ラッチ先生

onオン_mouseマウス_moveムーブ関数を使って、
boonボーンが マウスの方へ向く プログラムを 作りましょう

Python
def draw():
    screen.fill("white")
    boon.draw()
    enemy.draw()
    text_display.draw(screen)  #1 テキスト表示装備を準備する
Python
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

ポイント2

スック
スック

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

ラッチ先生
ラッチ先生

そして、
onオン_mouseマウス_downダウン(posポス)関数で、
クリックした場所へ 1秒かけて 動かします。

animateアニメイト()関数を 使うよ

Python
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"を代入する
スック
スック

これで、
boonボーンが敵に逃げるプログラムが 終わったよ

ラッチ先生
ラッチ先生

さあ、最後のプログラムです。
敵に 捕まったら boonボーンの動きを止めて セリフを 言わせましょう

ポイント1

Python
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トゥルー となります。

Python
    if enemy.collide_pixel(boon) and boon_state != "catch": 
スック
スック

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

ラッチ先生
ラッチ先生

今回は、
敵から クリックして逃げるゲームのプログラムを作りました。

敵から 逃げろ!
Python
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アニメイト()関数で作ったプログラムを
変数に代入すれば、アニメーションを操作することができる

これは、とても便利だから覚えておこうね

スック
スック

それじゃ、またね!

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

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

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