バードゲーム
背景
ウィンドウを表示すると同時に、draw関数内でscreen.blitで画像を描画します。
import pgzrun
import random
WIDTH = 400
HEIGHT = 708
def draw():
screen.blit('background', (0, 0))
pgzrun.go()
鳥の描画
鳥の画像を表示します。
bird = Actor('bird1', (75, 200))
def draw():
screen.blit('background', (0, 0))
bird.draw()
取りの表示を更新するupdate_bird関数を作り、update関数から呼び出します。 鳥が自動的に落下するようにy座標を増やしていきます。
def update_bird():
bird.y += 3
def update():
update_bird()
取りの落下速度を3固定では無く、変数にします。 birdの属性 vy に設定します。
bird.vy = 3
def update_bird():
bird.y += bird.vy
上下キーで鳥を上下に移動できるようにします。 上下キーを押したら、vyを変化させます。
def on_key_down(key):
if key == keys.UP:
bird.vy = -3
elif key == keys.DOWN:
bird.vy = 3
上昇時、下降時で画像を変えるようにします。
def update_bird():
bird.y += bird.vy
if bird.vy < 0:
bird.image = 'bird2'
else:
bird.image = 'bird1'
パイプの描画
まず、パイプのActorを作ります。
pipe_top = Actor('top', anchor=('left', 'bottom'), pos=(300, 380))
pipe_bottom = Actor('bottom', anchor=('left', 'top'), pos=(300, 450))
anchorは基準点を表します。pipe_topは左下、pipe_bottmは左上をposで指します。 drawでパイプを表示するようにします。
def draw():
screen.blit('background', (0, 0))
bird.draw()
pipe_top.draw()
pipe_bottom.draw()
パイプを左にスクロールしてくるようにします。この処理を行うupdate_pipesを作り、updateから呼び出すようにします。
def update_pipes():
pipe_top.left -= 3
pipe_bottom.left -= 3
def update():
update_bird()
update_pipes()
パイプが左端にスクロールし消えたらまた右端から出てくるようにします。この処理はreset_pipes関数にまとめて記述し、update_pipesから呼び出すようにします。
def update_pipes():
pipe_top.left -= 3
pipe_bottom.left -= 3
if pipe_top.right < 0:
reset_pipes()
def reset_pipes():
pipe_top.pos = (400, 380)
pipe_bottom.pos = (400, 450)
上のコードではパイプの隙間の場所は常に固定です。これをランダムに決めるようにします。
def reset_pipes():
gap = random.randint(200,500)
pipe_top.pos = (400, gap)
pipe_bottom.pos = (400, gap+100)
衝突判定
update_bird関数で鳥とパイプが衝突したかどうかを判定します。 衝突していたら画像を変更し、下に落ちるようにします。
if bird.colliderect(pipe_top) or bird.colliderect(pipe_bottom):
bird.image = 'birddead'
bird.vy = 5
鳥が死んだかどうかの属性deadをbirdに設定し、初期値をFalseにします。
bird = Actor('bird1', (75, 200))
bird.vy = 3
bird.dead = False
衝突していたときにはdeadをTrueにし、画像を変更できないようにします。
def update_bird():
bird.y += bird.vy
if bird.vy < 0:
bird.image = 'bird2'
else:
bird.image = 'bird1'
if bird.colliderect(pipe_top) or bird.colliderect(pipe_bottom):
bird.image = 'birddead'
bird.vy = 5
bird.dead = True
死んだ場合には画像を変更しないようにします。
if not bird.dead:
if bird.vy < 0:
bird.image = 'bird2'
else:
bird.image = 'bird1'
死んだ場合には操作できないようにします。
def on_key_down(key):
if bird.dead:
return
if key == keys.UP:
bird.vy = -3
elif key == keys.DOWN:
bird.vy = 3
リセットと得点
画面外に出た場合、再スタートするようにします。
※updateの一番下に書く。
if not 0 < bird.y < 720:
bird.y = 200
bird.dead = False
bird.vy = 0
reset_pipes()
何回パイプを通過したかを記録します。birdにscore属性を追加します。
bird = Actor('bird1', (75, 200))
bird.dead = False
bird.vy = 3
bird.score = 0
パイプリセット時に得点を増やします。
def update_pipes():
pipe_top.left -= 3
pipe_bottom.left -= 3
if pipe_top.right < 0:
reset_pipes()
bird.score += 1
drawで画面に表示します。
screen.draw.text( str(bird.score), color='white', midtop=(200, 10), fontsize=70, shadow=(1, 1) )