【Pygame Zero】キャラクターが マウスに向かって動く

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


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

今回のプロジェクトは、
基礎プログラムに 追加していきます。
下の「pygame zero」zipファイルを
ダウンロードしてください



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

学習の流れ
プログラミングの仕方を説明します
boonを マウスの方へ 向ける

boonを マウスの方へ向けるためには、
マウスポインターの位置を 知る必要が あります。
そこで、on_mouse_move()関数を 使います


そして、Actor()クラスの
angle_to()メゾットを 使って、boonを マウスの方へ 向けるんだ
Actor()クラスは、キャラクターを作る設計図です。
7. boon = Actor(“boon“, (400, 300))
変数boonには、Actor()クラス(設計図)が 入っています。

Actor()クラスに入っている
・ angle(キャラクターの向き)
・ angle_to(ターゲットの方へ向く角度を計算する)
・ move_towards(ターゲットの所へ 行く)
・ x (キャラクターの x座標)
・ y (キャラクターの y座標)
属性(データ)と メゾットを 「.(ドット)」を付けて 使います
オブジェクトとは?
設計図(クラス)で 作り出されたもの
・ キャラクター
・ キーボード
・ 背景 など
boonオブジェクト

設計図(クラス)は、
変数に 名前を付けて 保存する

def on_mouse_move(pos):
boon.angle = boon.angle_to(pos)


boon.angle = boon.angle_to(pos)
このプログラムについて 解説するね
まず、
① boon.angle_to(pos)
引数posには、マウスの位置が入っています
angle_to(pos)で、
マウスへの角度が 計算され ○度と答えが出る

② boon.angle = ○度
計算された○度を
boon.angle(boonの向き)に代入(=)する
すると、
③ boonは マウスの方を向く


なるほど!
① angle_to()メゾットで計算された角度を
② boon.angle に 代入されて ③ boonが マウスの方を 向くのね

プログラミングの世界では、
「=」は、代入する。
つまり、
boon.angleに、「○度(データ)」を 代入する と言うこと
数学の「=(イコール)」と 違うからね
数学の「=(イコール)」は、
プログラミングの世界では、「==」と書きます
覚えておいてね!
マウスの方へ 動く
それでは、
def update()関数を 使って
boonを マウスの方へ 動かしましょう



あっ!ぼく、わかるよ
boonを 動かうのに、move_forward()メゾットを 使うんでしょ
def update():
boon.forward(5)

あれっ?
boonが マウスポインターより 先に 行っちゃうよ…
def update()関数は、毎回更新されます。
move_forward(5)メゾットだと、ずっと5pxずつ動き続けちゃうんだ



そこで、目的地へ行くメゾットが あるんだ!
move_towards()メゾットです

move_towards(到達地,スピード)メゾット の 到達地は マウスの座標です
def on_mouse_move(pos)関数で
引数posの中に マウスの座標が 入っています
引数posを move_towards()メゾットの中に 入れて
move_towards(pos, 5)とすると、
エラーが出ます
def on_mouse_move()関数の 引数posを
他の関数に使うことが できないためです。

そこで、
変数mouse_x と 変数mouse_y を 作ります。


1.変数宣言をして、最初の値は「0」に する。
(マウスの最初の場所を (0、0))
mouse_x, mouse_y = 0, 0

次に、def on_mouse_move(pos)マウスの座標を 代入していきます
変数mouse_x, mouse_yの値は、
マウスの新しい座標のデータに更新されていくために
2.グローバル変数 宣言を する。
def on_mouse_move(pos):
global mouse_x, mouse_y
mouse_x, mouse_y = pos

3.引数posに 入っている(マウスのx座標, マウスのy座標)を
『=』を使って 変数mouse_x, 変数mouse_yに 代入する


なるほど!
これで、def update()関数にも
変数mouse_x, mouse_y にある データが、使えるんだね
そうです。
それでは、move_towards()メゾットに
変数mouse_x, mouse_yを 入れてみよう

def update():
boon.move_towards((mouse_x, mouse_y), 5)


これで、今回の学習は終了! おつかれさま
まとめ
今回は、
boonが マウスの方へ動き続けるプログラムを 作りました

import pgzrun
from pgzhelper import *
WIDTH = 800
HEIGHT = 590
boon = Actor("boon", (400, 300))
mouse_x, mouse_y = 0, 0
def draw():
screen.fill("white")
boon.draw()
def on_mouse_move(pos):
global mouse_x, mouse_y
mouse_x, mouse_y = pos
boon.angle = boon.angle_to(pos)
def update():
boon.move_towards((mouse_x, mouse_y), 5)
pgzrun.go()

move_towards()メゾットは、
ゲームを作る時 とても役に立つメゾットです
覚えておくと いいよ

はぁ~い!