PythonとpygameでFlappyBirdもどきを作ってみた

Python初心者がFlappyBirdもどき「FlappyPomupomu」を製作した。前回のテトリスに引き続いてpygameを使っての開発。サンプル動画や、実際のソースコード、その解説をご紹介する。

サンプル動画

FlappyPomupomuを実際に動かしている動画。

ソースコード|Githubからどうぞ

FlappyPomupomuのソースコードをGithubで公開している。実際にプレイしてみたい方も、Githubからダウンロードができる。

Github LINK: https://github.com/kotabu/FlappyPomupomu

解説

FlappyPomupomuのソースコードの解説をする。

pygameを使ったアニメーション

FlappyPomupomuでは、緑のpomupomuがアニメーションするように設定している。下記コードのように、count_xでフレームをカウントして、規定のカウント(5)になったら画像を切替えるようにしている。

## main.py

pomupomu = [
	 pygame.image.load(os.path.join('images','punipuni_001.png')),
	 pygame.image.load(os.path.join('images','punipuni_002.png')),
	 pygame.image.load(os.path.join('images','punipuni_003.png')),
	 pygame.image.load(os.path.join('images','punipuni_004.png'))
	]

...
while(1):
	count_x += 1

...

screen.blit(pomupomu[pomu_view],(pomu_x,pomu_y))
		if count_x == 5:
			if pomu_view < 3:
				pomu_view += 1
			elif pomu_view > 2:
				pomu_view = 0
			count_x = 0

pomupomuの移動速度を徐々に変化させる

緑のpomupomuは上昇する場合は徐々にスピードが落ちていき、下降する場合は徐々にスピードが上がる。単にY軸方向に値を足していくだけでは徐々に移動速度を変化させることができない。それで、下記コードのように、offsetの値を徐々に加算しつつY軸方向の値へ適用させることで徐々に速度を変化させることができる。

## main.py

if up_mode == 0:
	if pomu_y > 262 or pomu_y < 0:
		stop = gameover_text(gameover,screen)
	elif pomu_y < 301:
		pomu_y += offset
		offset += 0.2
elif up_mode == 1:
	if pomu_y < 0:
		stop = gameover_text(gameover,screen)
	pomu_y -= SPEED - offset
	offset += 0.2
	if SPEED - offset < 0:
		up_mode = 0
		offset = 0

障害物とpomupomuの衝突判定

pomupomuは常に同じX軸で移動しているので、障害物と接触するのは一定のX軸の範囲内だけだ。それで、下記コードのように「wall_x > 100 and wall_x < 160」の範囲内に障害物があるときだけ衝突判定をする。

Y軸に関しては、Wallクラスからランダムに帰ってくる障害物の種類による高さについての情報から設定する。

## wall.py
class Wall():
def __init__(self):		 
	self.wall = [
		 pygame.image.load(os.path.join('images','wall_001.png')),
		 pygame.image.load(os.path.join('images','wall_002.png')),
		 pygame.transform.flip(pygame.image.load(os.path.join('images','wall_001.png')),False,True) 
		]
	
def set_wall(self,r,wall_x,screen):
	if r == 0:
		screen.blit(self.wall[1],(wall_x,0))
		screen.blit(self.wall[1],(wall_x,40))
		screen.blit(self.wall[0],(wall_x,80))
			
		screen.blit(self.wall[2],(wall_x,220))
		screen.blit(self.wall[1],(wall_x,260))
		screen.blit(self.wall[1],(wall_x,300))
		
		return [115,186]
## main.py

wall = Wall()
danger_zone = wall.set_wall(r,wall_x,screen)

...

if wall_x > 100 and wall_x < 160:
	if pomu_y < danger_zone[0]:
		stop = gameover_text(gameover,screen)
	elif pomu_y > danger_zone[1]:
		stop = gameover_text(gameover,screen)

まとめと感想

テトリスに続けて製作したFlappyPomupomuだったが、テトリスよりもはるかに速く完成できた(製作期間1日程度)。ミュージックまでつけることができたので、前作よりもましなものになったように思う。画像を自作したが、もっとうまく作れたらいいなと思った。

共有する

このエントリーをはてなブックマークに追加

コメントをする

メールアドレスが公開されることはありません。
*のついている項目は必須です。


*