【Pygame Zero】キャラクターを 左右キーで 回転させる

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


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



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

学習の流れ
プログラミングの仕方を説明します
左右キーで boonを 回転させる

今回のプロジェクトでは、
pgzhelperモジュールに入っている関数は 使いません
削除しておきましょう
import pgzrun
from pgzhelper import * #削除する


それでは、boonを動かすので
def update()関数を 使ってプログラムを 作りましょう


boonの角度を 変えるには、
Actor()クラスの 属性angleを 使います
Actor()クラスは、キャラクターを作る設計図です。
6. boon = Actor(“boon“, (400, 300))
変数boonには、Actor()クラス(設計図)が 入っています。

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

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

def update():
boon.angle += 5

boonの向きが、 5度ずつ増えるんだね


ちなみに、
boonの向きを-5度ずつ増やしてみるよ
def update():
boon.angle += -5

「-5」にすると、
boonは 反対に回りだすね

boon.angle += ○
○の所に、
・「5」なら 左回り
・「-5」なら 右回り になります。
変数『rotate_direction』を 作って、
boon.angle += 5 × 『rotate_direction』
これで、変数『rotate_direction』の 数字(データ)によって
boonの回転の向きを 切り替えることが できます

どういうこと…?
boon.angle += 5 × 『rotate_direction』に ついて 解説
変数『rotate_direction』の数字(データ)が 「 1 」の場合
boon.angle += 5 × 「 1 」
boon.angle += 5
boon は、左回りに 回転します
変数『rotateo_direction』 の数字(データ) が 「ー1」の場合
boon.angle += 5 × 「 -1 」
boon.angle += -5
boon は、右回りに 回転します
つまり、変数『rotate_direction』 の数字を「1」 か「-1」に変えるだけで
boonの向きを 変えることができるんだ

なるほど!
そういうことね

それでは、
boon の 向きを決める
変数:rotate_direction を作りましょう

変数宣言をして、最初の値は 「 1 」にします
rotate_direction = 1


つぎは、
boon.angle += 5 に、変数「rotate_direction」を かけよう
def update():
boon.angle += 5 * rotate_direction

おおっ!回ったぞ

そして、
def on_key_down( )関数を使って
・ 右キーを押したら、
変数:ratate_directionを 「-1 」にして
右回りにする
・ 左キーを押したら、
変数:ratate_direcitonを 「 1 」にして
左回りにする
プログラムを 作るよ


変数:rotate_directionは、
「1」か「-1」と データが変わるから、グローバル宣言するよ
def on_key_down(key):
global rotate_direction


右キーが押されると、「keys.RIGHT」が
引数key に 入るよ
if key == keys.RIGHT:
rotate_direction = -1

そして、
左キーが押されると、「keys.LEFT」が
引数key に 入るよ
if key == keys.LEFT:
rotate_direction = 1

おおっ!
これで、左右キーでboonの回転をコントロールできるね
boonを クリックすると 止まる

on_mouse_down( ) 関数で
boonをクリックしたら止めるプログラムを 作ります。

変数:rotate_direction のデータを変えるために
グローバル宣言を するよ
def on_mouse_down(pos):
global rotate_direction


on_mause_down(pos)関数で、
マウスでクリックした場所が 引数posの中に あります。
Actor()クラスにあるcollidepoint()メゾットを使うと
boonに クリックしたか判定してくれるよ

if boon.collidepoint(pos):
rotate_direction = 0
boonが クリックされると、
boon.collidepoint(pos) は、「True」となり、
変数「rotate_direction」に 「0」が代入されます
19. boon.angle += 5 * rotate_direction では、
boon.angle += 5 × 「0」
boon.angle += 0 となります。
つまり、
boonのangle(角度)は、増えも減りもしないため 止まります

なるほど!
2秒間 「stop!」と表示する

最後に、boonが止まったら、「stop!」と 言わせます。
screen.drawにあるtextメゾットを 使います。

オブジェクトとは?
設計図(クラス)で 作り出されたもの
・ キャラクター
・ キーボード
・ 背景
・ 文字 など
drawオブジェクト

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


まずは、def draw()関数で「stop!」を 表示しよう
この時に、
文字の
・大きさ
・場所
・色 を決めていこう
screen.draw.text("stop!", center=(400, 220), fontsize=70, color="red")


おっ!
boonの上に「stop!」が 表示されたぞ

「stop!」の場所が決まったら、「stop!」を表示するスイッチ
変数:is_text_show を作りましょう

bool型変数名は、『is_○○』が よく使われます
この『is_○○』は、「○○ですか?」という意味が 理解でき、
他のプログラムを読む人にも bool型変数だと すぐわかるからです
is_text_show = False


つぎに、
boonがクリックした時に
変数:is_text_showを 「True 」にして、文字を表示させます
def on_mouse_down(pos):
global rotate_direction, is_text_show


グローバル宣言したので、
変数のデータを「False」から「True」に 変えることができるよ
if boon.collidepoint(pos):
rotate_direction = 0
is_text_show = True

if 文を使って、変数is_text_showが 「True」に なったら
「stop!」を 表示させるよ
if is_text_show:
screen.draw.text("stop!", center=(400, 220), fontsize=70, color="red")

おおっ!
「stop!」が 表示されたぞ

最後に
この「stop!」を2秒後に消すプログラムを 作ります。
pygame zeroライブラリーには、Clockと言うタイマー機能を提供するオブジェクトがあります。


この中のschedule( )メゾットを使って
「stop!」を2秒後に 消します。
まず、「stop!」を消すプログラム
hide_text関数を 作りましょう
def hide_text():
global is_text_show
is_text_show = False


変数is_text_showが 「False」になれば、
「stop!」の文字列は、消えるもんね

clock.schedule(hide_text, 2.0)

あれっ?
回転が止まっている時に
boonをクリックしても 「stop!」と 表示が出てしまうよ

おぉぉぉ…と!
クリックするたびに、
on_mouse_down関数が 実行してしまうんだ
boonをクリックした時の条件に
boonが 動いているを 付け加えよう
if boon.collidepoint(pos) and rotate_direction != 0:
rotate_direction = 0
is_text_show = True
clock.schedule(hide_text, 2.0)

うん!
止まっているboonにクリックしても、表示されないね

これで、今回の学習は終了! おつかれさま
まとめ
今回は、
左右キーで boonを回転させて、クリックされたら止まるプログラムを
作りました

import pgzrun
WIDTH = 800
HEIGHT = 590
boon = Actor("boon", (400, 300))
rotate_direction = 1
is_text_show = False
def draw():
screen.fill("white")
boon.draw()
if is_text_show:
screen.draw.text("stop!", center=(400, 220), fontsize=70, color="red")
def update():
boon.angle += 5 * rotate_direction
def on_key_down(key):
global rotate_direction
if key == keys.RIGHT:
rotate_direction = -1
if key == keys.LEFT:
rotate_direction = 1
def on_mouse_down(pos):
global rotate_direction, is_text_show
if boon.collidepoint(pos) and rotate_direction != 0:
rotate_direction = 0
is_text_show = True
clock.schedule(hide_text, 2.0)
def hide_text():
global is_text_show
is_text_show = False
pgzrun.go()

クリックされたか判別する
collidepoint()メゾットの使い方が わかったかな
このメゾットを使って 面白いゲームをつくってみよう!

はぁ~い!