2020年05月06日
pygame 壁ピンポン!!ゲーム
これまでのpygameスクリプを
少々きれいに書き直して、
「壁ピンポン」のゲームにしました。
少々きれいに書き直して、
「壁ピンポン」のゲームにしました。
#!usr/bin/env python3
#--*coding:utf-8*--
import pygame
from pygame.locals import*
import sys
import os
START,PLAY,GAMEOVER=(0,1,2) #3つのゲーム状態を0~2の数字に定義
SCR_RECT=Rect(0,0,480,640) #画面とする大きさを定義(左上位置(0,0,横軸幅と縦軸高x,y))
GAME_PLAYER_RECT=Rect(0,320,480,320) #動ける範囲は下半分だけにする
"""壁ピンポンをクラスで管理"""
class WallPingPong():
def __init__(self):
self.counter=0 #ゲーム内の時間を記録するカウンターを作成、初期値を0とする
self.score=0 #ゲーム内の得点を作成し、初期値を0とする
pygame.init()
screen=pygame.display.set_mode(SCR_RECT.size)
pygame.display.set_caption(u"壁ピンポン!!")
"""素材のロード"""
self.load_images()
"""ゲームオブジェクトを初期化"""
self.init_game()
clock=pygame.time.Clock()
"""メインループ開始"""
while True:
clock.tick(60)
self.update()
self.draw(screen)
pygame.display.update()
self.key_handler()
def init_game(self):
"""ゲームオブジェクトを初期化"""
#ゲーム状態
self.game_state=START
#ラケットを作成
self.racket=Racket()
#動く速度の異なる4つのボールを作成、引数は順に(vx,vy,self.racket)
self.ball1=Ball(10,10,self.racket)
self.ball2=Ball(3,4,self.racket)
self.ball3=Ball(-2,3,self.racket)
self.ball4=Ball(-6,3,self.racket)
#スプライトグループを作成して登録
self.group1=pygame.sprite.RenderUpdates()
self.group2=pygame.sprite.RenderUpdates()
self.group1.add(self.racket)
self.group2.add(self.ball1,self.ball2,self.ball3,self.ball4)
#作成した4つのボールを1つにグループ化し、後にpygame.sprites()のモジュールを利用
self.balls=pygame.sprite.Group(self.group2)
def update(self):
"""ゲーム状態の更新"""
if self.game_state==PLAY:
self.counter+=1
self.group1.update()
self.group2.update()
"""ゲームオーバーの条件"""
if len(self.balls.sprites())==0: #クループが格納しているオブジェクト(ボール)の数が0になったら
self.game_state=GAMEOVER #ゲームオーバーにする
#group1(racket格納)とgroup2(4つのボール格納)の接触を定義(Falseは接触しても消えずに残る、Trueにすると消える)
ball_collided=pygame.sprite.groupcollide(self.group1,self.group2,False,False)
"""得点が入る条件"""
if ball_collided: #接触したら
self.score+=10 #10点を追加
def draw(self,screen):
""""描画"""
screen.fill((0,180,0))
if self.game_state==START: #ゲームスタート画面
#title名を描画
title_font=pygame.font.SysFont(None,80)
title=title_font.render("Wall PingPong!!",True,(255,0,0))
screen.blit(title,((SCR_RECT.width-title.get_width())//2,100))
#PUSH STARTを描画
push_font=pygame.font.SysFont(None,40)
push=push_font.render("PUSH SPACE KEY",True,(0,0,0))
screen.blit(push,((SCR_RECT.width-push.get_width())//2,SCR_RECT.centery))
elif self.game_state==PLAY: #ゲームプレイ画面
pygame.draw.line(screen,(255,255,255),(0,320),(480,320),3) #中央に白線を引く
pygame.draw.ellipse(screen,(255,255,255),(140,220,200,200),5) #中央に円を引く
self.group1.draw(screen)
self.group2.draw(screen)
stat_font=pygame.font.SysFont(None,36)
stat=stat_font.render("Score:{:05d} Counter:{:05d}".format(self.score,self.counter),True,(255,0,0))
screen.blit(stat,(0,0))
elif self.game_state==GAMEOVER: #ゲームオーバー画面
#得点を表示
stat_font=pygame.font.SysFont(None,36)
stat=stat_font.render("Score:{:05d} Counter:{:05d}".format(self.score,self.counter),False,(255,0,0))
screen.blit(stat,(0,0))
#GAME OVERを描画
gameover_font=pygame.font.SysFont(None,80)
gameover=gameover_font.render("GAMEOVER",True,(0,0,0))
screen.blit(gameover,((SCR_RECT.width-gameover.get_width())//2,100))
#PUSH STARTを描画
push_font=pygame.font.SysFont(None,40)
push=push_font.render("PUSH SPACE KEY",True,(0,0,0))
screen.blit(push,((SCR_RECT.width-push.get_width())//2,SCR_RECT.centery))
#クレジットを描画
cresit_font=pygame.font.SysFont(None,20)
cresit=cresit_font.render("2020 by https://fanblogs.jp/aimyself/",True,(0,0,0))
screen.blit(cresit,((SCR_RECT.width-cresit.get_width())//2,600))
def key_handler(self):
"""キーハンドラー"""
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
elif event.type==KEYDOWN and event.key==K_ESCAPE:
pygame.quit()
sys.exit()
elif event.type==KEYDOWN and event.key==K_SPACE:
if self.game_state==START: #スタート画面でスペース押したら
self.game_state=PLAY
elif self.game_state==GAMEOVER: #ゲームオーバ画面でスペース押したら
self.score=0
self.counter=0
self.init_game() #ゲームを初期化して
self.game_state=PLAY #ゲーム状態をプレイにする
def load_images(self):
"""画像素材をpygame用に調整(def load_image:)して読み込む"""
Racket.image=load_image("racket.png")
Ball.image=load_image("ball.png")
class Racket(pygame.sprite.Sprite):
"""ラケット"""
speed=10 #移動速度
def __init__(self):
#imageとcontainersはmain()でセット
pygame.sprite.Sprite.__init__(self)
self.rect=self.image.get_rect()
self.rect.center=(SCR_RECT.width/2,SCR_RECT.height)
def update(self):
#押されているキーをチェック
pressed_keys=pygame.key.get_pressed()
#押されているキーに応じてラケットを移動
if pressed_keys[K_LEFT]:
self.rect.move_ip(-self.speed,0)
elif pressed_keys[K_RIGHT]:
self.rect.move_ip(self.speed,0)
elif pressed_keys[K_UP]:
self.rect.move_ip(0,-self.speed)
elif pressed_keys[K_DOWN]:
self.rect.move_ip(0,self.speed)
self.rect.clamp_ip(GAME_PLAYER_RECT)
class Ball(pygame.sprite.Sprite):
"""ボールの描画"""
def __init__(self,vx,vy,racket):
pygame.sprite.Sprite.__init__(self)
self.rect=self.image.get_rect()
self.rect.center=(SCR_RECT.width/2,10)
self.vy=vy
self.vx=vx
self.racket=racket
def update(self):
self.rect.move_ip(self.vx,self.vy)
if self.rect.left<0 or self.rect.right>SCR_RECT.width:
self.vx=-self.vx
if self.rect.top<SCR_RECT.top:
self.vy=-self.vy
if self.rect.colliderect(self.racket.rect) and self.vy>0:
self.vy=-self.vy
if self.rect.bottom>SCR_RECT.bottom:
self.kill()
def load_image(filename):
"""用意した画像をpygameで扱える形に変換する"""
image=pygame.image.load(filename).convert_alpha()
return image
if __name__=="__main__":
WallPingPong()
【このカテゴリーの最新記事】