チャプター3では簡単なアクションゲームを作成しました。
チャプター4では4つの記事を通して ブロック崩しゲーム を作成していきましょう。
Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう
Chapter4:ブロック崩しを作ろう
・Chapter4-1:ボールを壁に反射させよう ◁今回はここ
・Chapter4-2:反射させるバーを設置しよう
・Chapter4-3:ボールが画面下に落ちたらゲームオーバーにしよう
・Chapter4-4:ぶつかると消えるブロックを配置しよう
Chapter5:シューティングゲームを作ろう
Chapter6:pygameのお役立ち情報
このチャプターから、いよいよ本格的なゲーム制作がスタートします。
「ブロック崩しゲーム」を4つのステップに分けて、少しずつ作り上げていきましょう!
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の完成コード
-
今回の記事での完成するコード全体は↓↓の通りです。
必要な方は開いて確認しましょう。
# 初期化(ゲームの準備をする) import pygame, sys, random pygame.init() screen = pygame.display.set_mode((800, 600)) ## 背景の設定 haikei_img = pygame.image.load("images/hoshizora.png") 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()
質問用コンタクトフォーム
この記事を書くにあたりAIを活用しています。
人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。