ながみえ

チャプター3では簡単なアクションゲームを作成しました。

チャプター4では4つの記事を通して ブロック崩しゲーム を作成していきましょう。

Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう
Chapter4:ブロック崩しを作ろう
 ・Chapter4-1:ボールを壁に反射させよう ◁今回はここ
 ・Chapter4-2:反射させるバーを設置しよう
 ・Chapter4-3:ボールが画面下に落ちたらゲームオーバーにしよう
 ・Chapter4-4:ぶつかると消えるブロックを配置しよう
Chapter5:シューティングゲームを作ろう
Chapter6:pygameのお役立ち情報

このチャプターから、いよいよ本格的なゲーム制作がスタートします。

「ブロック崩しゲーム」を4つのステップに分けて、少しずつ作り上げていきましょう!

Chapter4-1ではゲーム画面に「ボール」を登場させ、そのボールが上下左右の壁にぶつかると跳ね返る、という処理を実装します。

見た目の変化もあり、動きが加わることで、よりゲームらしさが感じられるようになりますよ!

注意点

チャプター4を通してブロック崩しゲームを制作するにあたり、ベースとなるコードや使用する画像をまとめた「Chapter4_set.zip」を 無料配布 しています。

まだ入手していない人は、まずは pygameのトップページ に移動し、チャプター4の章から ダウンロード してください。

<<前のページ

pygameの記事一覧

Pythonのゲームライブラリ pygame を使ってゲームアプリを制作するページのアイキャッチ画像

次のページ>>

ブロック崩しゲーム制作の準備

まずはダウンロードしたzipファイルを展開し、その中の「brick_breaker.py」を実行してください。

背景画像として「星空」が表示されるようになっており、雰囲気のあるゲーム画面の準備ができています。

ただし、現時点ではゲームの中に登場するボールやバー、ブロックといった要素はまだ何も表示されていません。

つまり、これはゲームを動かすための「キャンバス」が整った段階といえるでしょう。まずはここにボールを登場させましょう。

また「brick_breaker.py」は今回だけでなくChapter4-4まで通して使用します。

毎回少しずつコードを書き足していき、最終的にブロック崩しゲームを完成させましょう。

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

ボールの登場と設定

それでは、ゲーム画面にボールを登場させてみましょう。

ボールの登場には、pygame.Rectを使って、ボールの位置とサイズを定義します。

今回は、中心位置(x=400, y=450)で、直径30ピクセルのボールを作成します。

また、ボールを動かすためには「どの方向に進むか」を決める必要があります。そこで、横方向の速度 vx と縦方向の速度 vy を変数として用意します。

コードを書いてみよう

「brick_breaker.py」の中の「#初期化(ゲームの準備をする)」の部分に以下のコードを書きたしましょう。

## ボールの設定
ball_rect = pygame.Rect(400, 450, 30, 30)  # x=400, y=450 の位置に、30x30の正方形を配置
vx = random.randint(-10, 10)  # x方向の初期速度(ランダムに設定)
vy = -5                       # y方向の初期速度(上に向かって移動)

ここで定義している ball_rect は、ボールの位置とサイズを管理するための「枠」となります。

Pygameでは、円を直接的に定義することはできないため、正方形の中に円を描くという方法で表現します。

速度については、x方向をランダムにすることで、毎回少し違った動きが楽しめるようになります。

壁との衝突判定と反射処理

ボールをただ動かすだけでは、すぐに画面の外へ出ていってしまいます。

ゲームらしくするためには、画面の端にぶつかったときに、ボールを跳ね返す処理(反射処理)が必要です。

反射を実現するには、ボールの位置が画面の端に到達したかを判定し、到達していたら速度の向きを反転させるという考え方をします。

コードを書いてみよう

「## ゲームステージ関数」の中の「# ボールの処理」の部分に以下のコードを書きたしましょう。

# ボールの処理
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  # 横方向の速度を反転
# ボールが画面下に到達したら(Chapter4-3で追記)
# バーがボールと衝突したら(Chapter4-2で追記)
ball_rect.x += vx  # x方向に移動
ball_rect.y += vy  # y方向に移動

このコードでは画面サイズ(横800px、縦600px)をもとに、ボールの左端・右端、上端・下端が画面からはみ出していないかをチェックしています。

  • ball_rect.x はボールの左端の位置
  • ball_rect.y はボールの上端の位置
  • 800 - 30600 - 30 は、ボールのサイズ(30ピクセル)を引いた「右端」や「下端」の限界位置

ボールが端に到達していたら、対応する速度の符号(プラス/マイナス)を逆にすることで跳ね返る動きを実現しています。

ワンポイント

一般的なブロック崩しゲームでは、ボールが画面下に到達したら負けになります。

今回制作するゲームもそのようにしますが、この時点では動きを分かりやすくするために、画面下でも跳ね返るコードとしています。

【Python】勉強猫がノートパソコンを見ながら考え込む様子。記事内の休憩用イラスト

ボールの描画処理

ボールの位置や動きはすでにプログラムで管理されていますが、それだけでは画面に表示されません。

実際にボールを画面に描くには、Pygameの描画関数を使う必要があります。

ここでは、pygame.draw.circle() を使って、画面にボールを円として描画します。

コードを書いてみよう

「## ゲームステージ関数」の中の「# ボールの処理」の部分に以下のコードを書きたしましょう。

先ほど書き足したコードの下です。

pygame.draw.circle(
    screen,                # 描画先の画面
    pygame.Color("GOLD"),  # ボールの色(GOLDに設定)
    ball_rect.center,      # 円の中心座標(Rectの中心)
    ball_rect.width // 2   # 円の半径(Rectの幅の半分)
)

このコードでは、以下の点がポイントです:

  • screen:どこに描くか(ここではメイン画面)
  • pygame.Color("GOLD"):色の指定。英語の色名が使えます
  • ball_rect.center:ボールの中心位置。Rectオブジェクトが自動で算出してくれます
  • ball_rect.width // 2:円の半径。ボールの幅の半分にすることで、正円として表示されます

この処理をゲームループの中に組み込むことで、毎フレームごとにボールが現在の位置に描画されるようになります。

画面に金色のボールが跳ね返りながら動いているのを確認できれば、成功です!

ワンポイント

覚えてますか???

円を表示するコードは↓↓

pygame.draw.circle(画面, 色, (X, Y), 半径)

まとめ

お疲れさまでした!

今回はブロック崩しゲームの第一歩として、ボールを画面に表示し、壁に当たったときに跳ね返る処理を実装しました。

次回のチャプターでは、プレイヤーが操作できる「バー」を登場させます。

これにより自分でボールの動きを制御する要素が加わり、よりインタラクティブなゲームに近づいていきますよ。

この調子で、少しずつステップアップしながら、完成を目指して一緒に進んでいきましょう!

Q
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()

<<前のページ

pygameの記事一覧

Pythonのゲームライブラリ pygame を使ってゲームアプリを制作するページのアイキャッチ画像

次のページ>>

質問用コンタクトフォーム

この記事を書くにあたりAIを活用しています。

人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。

pygame記事一覧へ戻る
Python記事一覧へ戻る

記事URLをコピーしました