【Pygame|Extra1-1】ブロック崩しを作ろう

チャプター3では簡単なアクションゲームを作成しました。
チャプター4では4つの記事を通して ブロック崩しゲーム を作成していきましょう。
【Pygame入門編】
Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう
【Pygame実践編】
Extra1:ブロック崩しを作ろう
・Extra1-1:ボールを壁に反射させよう ◁今回はここ
・Extra1-2:反射させるバーを設置しよう
・Extra1-3:ボールが画面下に落ちたらゲームオーバーにしよう
・Extra1-4:ぶつかると消えるブロックを配置しよう
Extra2:シューティングゲームを作ろう
Extra3:オセロ(リバーシ)を作ろう
Extra4:ナインゲームを作ろう
Extra5:横スクロールのアクションゲームを作ろう
このチャプターから、いよいよ本格的なゲーム制作がスタートします。
「ブロック崩しゲーム」を4つのステップに分けて、少しずつ作り上げていきましょう!
第1ステップであるChapter4-1ではゲーム画面に「ボール」を登場させ、そのボールが上下左右の壁にぶつかると跳ね返る、という処理までを実装します。

ブロック崩しゲーム制作の準備
まずはダウンロードしたzipファイルを展開し、その中の「brick_breaker.py」を実行してください。
背景画像として「星空」が表示されるようになっており、雰囲気のあるゲーム画面の準備ができています。
ただし、現時点ではゲームの中に登場するボールやバー、ブロックといった要素はまだ何も表示されていません。
つまり、これはゲームを動かすための「キャンバス」が整った段階といえるでしょう。まずはここにボールを登場させましょう。

また「brick_breaker.py」は今回だけでなくChapter4-4まで通して使用します。
毎回少しずつコードを書き足していき、最終的にブロック崩しゲームを完成させましょう。

ボールの登場と設定
それでは、ゲーム画面にボールを登場させてみましょう。
ボールの登場には、pygame.Rectを使って、ボールの位置とサイズを定義します。
今回は、中心位置(x=400, y=450)で、直径30ピクセルのボールを作成します。
また、ボールを動かすためには「どの方向に進むか」を決める必要があります。そこで、横方向の速度 vx と縦方向の速度 vy を変数として用意します。
ここで定義している ball_rect は、ボールの位置とサイズを管理するための「枠」となります。
Pygameでは、円を直接的に定義することはできないため、正方形の中に円を描くという方法で表現します。
速度については、x方向をランダムにすることで、毎回少し違った動きが楽しめるようになります。
壁との衝突判定と反射処理
ボールをただ動かすだけでは、すぐに画面の外へ出ていってしまいます。
ゲームらしくするためには、画面の端にぶつかったときに、ボールを跳ね返す処理(反射処理)が必要です。
反射を実現するには、ボールの位置が画面の端に到達したかを判定し、到達していたら速度の向きを反転させるという考え方をします。
このコードでは画面サイズ(横800px、縦600px)をもとに、ボールの左端・右端、上端・下端が画面からはみ出していないかをチェックしています。
ball_rect.xはボールの左端の位置ball_rect.yはボールの上端の位置800 - 30や600 - 30は、ボールのサイズ(30ピクセル)を引いた「右端」や「下端」の限界位置
ボールが端に到達していたら、対応する速度の符号(プラス/マイナス)を逆にすることで跳ね返る動きを実現しています。

ボールの描画処理
ボールの位置や動きはすでにプログラムで管理されていますが、それだけでは画面に表示されません。
実際にボールを画面に描くには、Pygameの描画関数を使う必要があります。
ここでは、pygame.draw.circle() を使って、画面にボールを円として描画します。
このコードでは、以下の点がポイントです:
screen:どこに描くか(ここではメイン画面)pygame.Color("GOLD"):色の指定。英語の色名が使えますball_rect.center:ボールの中心位置。Rectオブジェクトが自動で算出してくれますball_rect.width // 2:円の半径。ボールの幅の半分にすることで、正円として表示されます
この処理をゲームループの中に組み込むことで、毎フレームごとにボールが現在の位置に描画されるようになります。
画面に金色のボールが跳ね返りながら動いているのを確認できれば、成功です!
まとめ
お疲れさまでした!
今回はブロック崩しゲームの第一歩として、ボールを画面に表示し、壁に当たったときに跳ね返る処理を実装しました。
次回のチャプターでは、プレイヤーが操作できる「バー」を登場させます。
これにより自分でボールの動きを制御する要素が加わり、よりインタラクティブなゲームに近づいていきますよ。
この調子で、少しずつステップアップしながら、完成を目指して一緒に進んでいきましょう!
- Chapter4-1の完成コード
-
今回の記事での完成するコード全体は↓↓の通りです。
必要な方は開いて確認しましょう。
from pathlib import Path import pygame, sys, random # 初期化(ゲームの準備をする) pygame.init() screen = pygame.display.set_mode((800, 600)) ## 背景の設定 img_path = Path(__file__).parent / "images" / "hoshizora.png" haikei_img = pygame.image.load(str(img_path)) haikei_img = pygame.transform.scale(haikei_img, (800, 600)) ## ボールの設定 ball_rect = pygame.Rect(400, 450, 30, 30) vx = random.randint(-10, 10) vy = -5 ## バーの設定 ## ブロックの設定 ## リプレイボタンの設定 replay_img = pygame.image.load("images/replaybtn.png") ## メインループ内で使う変数 pushFlag = False page = 1 score = 0 # ここから各関数の定義 ## ゲームステージ関数 def gamestage(): # 画面の初期化 global vx, vy, page, score screen.blit(haikei_img, (0,0)) # ユーザー入力 # ボールの処理 if ball_rect.y < 0 or ball_rect.y > 600 - 30: # もしボールが画面の上下端に到達したら vy = -vy if ball_rect.x < 0 or ball_rect.x > 800 - 30: # もしボールが画面の左右端に到達したら vx = -vx ball_rect.x += vx ball_rect.y += vy pygame.draw.circle(screen, (pygame.Color("GOLD")), ball_rect.center, ball_rect.width // 2) # バーの処理 # ブロックの処理 ## ジャンプ関数(ボタンが押されたらnewpageへジャンプする) ## リセット関数(ゲームをリセットする) ## ゲームオーバー関数 ## ゲームクリア関数 # メインループ while True: gamestage() # 画面表示 pygame.display.update() pygame.time.Clock().tick(60) # 終了処理 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit()


