コンテンツにスキップ

PyGameZero

準備

PyGame Zeroは2次元ゲーム用のライブラリです。PyGameをより簡単に利用できます。 インストールをpipコマンドで行います。

pip install pgzero

ウィンドウの描画

pgzrunをインポートし、go関数で実行します。 WIDTHに画面の幅、HEIGHTに高さを指定します。これで実行するとウィンドウが表示されます。

import pgzrun
WIDTH = 800
HEIGHT = 600
pgzrun.go()

pgzrun.go()は必ず最後に行います。

背景色を変えてみます。描画を行うには draw関数を定義します。 この中で背景色を設定するscreen.fillを行い、色を指定します。 pgzrun.go()の前で以下を行います。

def draw():
    screen.fill((128, 0, 0))

画像の描画

画像を描画するには、まず、imagesフォルダに対象画像を保存します。

画像の例として、KENNYの2Dアセットの中からPlatformer Art Deluxeをダウンロードし、Extra animations and enemiesフォルダ内のAlien sprites内にある alienPink.png を使用します。

ファイル名は小文字のみですので名前をalien.pngに変更し、imagesフォルダに保存します。

最初にalienという変数で、Actorオブジェクトを生成します。そのコンストラクタの最初の引数には画像ファイル名(拡張子省略)を指定します。第二引数に位置を指定します。

alien = Actor('alien', pos=(100,50))

drawメソッドでalienオブジェクトのdrawメソッドを呼び出し描画します。

def draw():
    alien.draw()

画像の移動

画像を動かしてみます。 移動させるには、画像のleftやtopなどの座標を変えます。 これを行うのは、update関数内です。この関数は一定時間毎に自動的に呼び出されます。

def update():
    alien.left += 2

ただし、このままでは前の画像が残ってしまいます。 そこで、drawの描画を行うときに、いったんスクリーンをクリアします。

def draw():
    screen.clear()
    alien.draw()

画像の速度は2で固定なのでこれを変数にしてみます。 alineオブジェクトを生成した後に、vx 属性に 2 を入れます。

alien = Actor('alien', pos=(100,50))
alien.vx = 2

そして、それをupdateで足すようにします。

def update():
    alien.left += alien.vx

キーボードの処理

キーを押したときに何かが起こるようにしてみます。 キーを押したらon_key_downメソッドが自動的に呼ばれます。 そのとき、引数 key にはどのキーを押したかが入っています。

# スペースキーを押したとき、spaceと表示
def on_key_down(key):
    if key == keys.SPACE:
        print("space")

左右の矢印キーで移動方向を変えるようにしてみます。

def on_key_down(key):
    if key == keys.RIGHT:
        alien.vx = 2
    elif key == keys.LEFT:
        alien.vx = -2

上下の移動も出来るようにします。まず、vx以外にvyも作ります。vxもvyも0で初期化します。

alien = Actor('alien', pos=(100,50))
alien.vx = 0
alien.vy = 0

update関数でvyをtopに足すようにします。topは上の座標を表します。

def update():
    alien.left += alien.vx
    alien.top += alien.vy

上キー、下キーでvyを変化させます。

def on_key_down(key):
    if key == keys.RIGHT:
        alien.vx = 2
    elif key == keys.LEFT:
        alien.vx = -2
    elif key == keys.UP:
        alien.vy = -2
    elif key == keys.DOWN:
        alien.vy = 2

衝突判定

ゲームの目的として、他のアイテムの場所まで移動させることとします。

他のアイテムとして cherry を使います。場所は右下に置きます。

cherry = Actor('cherry', pos=(750,550))

draw関数でcherryを表示します。

def draw():
    screen.clear()
    alien.draw()
    cherry.draw()

alienとcherryが衝突したかどうかは、colliderect関数で判定します。 衝突したら gameclear関数を呼ぶようにします。

def update():
    alien.left += alien.vx
    alien.top += alien.vy

    # cherryとの衝突判定
    if alien.colliderect(cherry):
        gameclear()

gameclear関数ではalienが動かなくなるように vx と vy を 0 にします。

def gameclear():
    alien.vx = 0
    alien.vy = 0

文字の表示

ゲームのクリアを判定して、クリアしたら CLEARの文字を表示することにします。 まず、ゲーム開始時にはクリアしていないことを示すために、alien.clear に False を入れておきます。

alien = Actor('alien', pos=(100,50))
alien.vx = 0;
alien.vy = 0;
alien.clear = False

ゲームクリア時に、alien.clear に True を入れます。

def gameclear():
    alien.vx = 0
    alien.vy = 0
    alien.clear = True

alien.clear が Trueなら画面に「CLEAR!」を出します。

def draw():
    screen.clear()
    alien.draw()
    cherry.draw()
    if(alien.clear):
        screen.draw.text("CLEAR!", center=(400, 200), color=(255,255,255), fontsize=48)

マウスクリック

では、エイリアンをクリックしたら何かが起こるようにします。 そのためには、on_mouse_down関数を定義します。

def on_mouse_down(pos):
    print(pos)

引数posにはクリックした位置が入っています。マウスをクリックするとその座標がコンソールに出力されます。

画像をクリックしたら、という判定には、Actorクラスのcollidepointメソッドを使います。 collideとは衝突という意味です。その場所がActorに衝突しているかが分かります。

def on_mouse_down(pos):
    if alien.collidepoint(pos):
        print("Hit!")

画像をクリックしたら、画像を変更してみます。 alienPink_hurt.png を alien_hurt.png に名前変更し、imagesに置きます。 Actorのimageプロパティを変更すると、画像が変わります。

def on_mouse_down(pos):
    if alien.collidepoint(pos):
        alien.image = 'alien_hurt'

クロック

一定時間後に何かをしたい場合にはclockを使います。 例えば、画像をクリックして画像が変わった後、一定時間後に元にもどしたい場合などです。

clockのschedule_uniqueを使うと一定時間後に特定の関数を呼び出すことが出来ます。

def on_mouse_down(pos):
    if alien.collidepoint(pos):
        alien.image = 'alien_hurt'
        clock.schedule_unique(set_alien_normal, 0.5)

この例ではset_alien_normal関数を0.5秒後に呼び出しています。 set_alien_normal関数では、画像を通常のものに戻します。

def set_alien_normal():
    alien.image = 'alien'

文字の描画

文字は screen.draw.text関数で描画します。

screen.draw.text(文字列, 位置, color=色, fontsize=サイズ)

※その他にbackgroundで背景色、widthで最大幅、alignで寄せなどが指定できます。 公式サイト参照

def draw():
    screen.clear()
    screen.draw.text("Hello!", (100, 200), color=(255,255,255), fontsize=48)
    alien.draw()

中央に指定したい場合、位置を引数midtopで指定します。

def draw():
    screen.clear()
    screen.draw.text("Hello!", midtop=(WIDTH//2, 100), color='white', fontsize=48)
    alien.draw()

画像をクリックした回数を表示してみます。 まず、count属性に0を設定しておきます。

alien.count=0

クリックしたらcountを1増やすようにします。

def on_mouse_down(pos):
    if alien.collidepoint(pos):
        alien.image = 'alien_hurt'
        alien.count+=1
        clock.schedule_unique(set_alien_normal, 0.5)

描画時に中央に出力します。

def draw():
    screen.clear()
    screen.draw.text(str(alien.count), midtop=(WIDTH//2, 100), color='white', fontsize=48)
    alien.draw()