【Pygame|Extra1-2】反射させるバーを設置しよう

一つ前のチャプターでは壁に反射するボールを設置しました。
今回は ボールを反射させるバー を設置しましょう。
【Pygame入門編】
Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう
【Pygame実践編】
Extra1:ブロック崩しを作ろう
・Extra1-1:ボールを壁に反射させよう
・Extra1-2:反射させるバーを設置しよう ◁今回はここ
・Extra1-3:ボールが画面下に落ちたらゲームオーバーにしよう
・Extra1-4:ぶつかると消えるブロックを配置しよう
Extra2:シューティングゲームを作ろう
Extra3:オセロ(リバーシ)を作ろう
Extra4:ナインゲームを作ろう
Extra5:横スクロールのアクションゲームを作ろう
前回はボールが画面の端に当たったときに反射する処理を追加し、画面内を跳ね回るようにしました。
今回は、いよいよプレイヤーが操作する「バー」を追加していきます。
ブロック崩しゲームではこのバーがプレイヤーの操作の中心になります。バーを左右に動かし、落ちてくるボールを跳ね返してブロックを壊していくのがゲームの基本的な流れです。
今回のチャプターでは、以下のことができるようになります。
- 画面下にバーを表示する
- バーをマウスで操作できるようにする
- バーにボールが当たったら、ボールが跳ね返るようにする
それでは順を追って解説していきましょう。

バーを画面に表示しよう
それではまず、バーを画面上に表示してみましょう。
バーは「長方形の図形」として描画することができます。pygameでは、このような図形を「Rect(レクト)」というデータ型を使って定義します。

Rectとは何か?
Rect は四角形の位置とサイズを表すためのオブジェクトです。以下のような書き方で使います。
pygame.Rect(左上のx座標, 左上のy座標, 横幅, 高さ)
今回のバーは、画面の下部に配置しましょう。
このコードでは以下のようなバーが作成されます。
- 横位置(x座標)を400
- 縦位置(y座標)を550(画面下部)
- 幅を100ピクセル
- 高さを10ピクセル
画面にバーを表示するには?
バーを画面に表示するには、pygame.draw.rect() を使います。この関数は指定した色と Rect の情報をもとに、画面上に四角形を描画します。
これでバーが画面下部に表示されるようになります。
マウスでバーを動かそう
バーを画面に表示できたら、次はそのバーをプレイヤーが操作できるようにしましょう。
今回は、マウスの動きに連動してバーが左右に動くようにします。これにより、プレイヤーはマウスを使って直感的に操作できるようになります。
バーの中心をマウスカーソルに合わせるには、バーのx座標をマウスのx座標からバーの半分の長さを引いた値にします。
バーの幅は100ピクセルなので、「bar_rect.x = mx – 50」となる訳です。
これにより、マウスカーソルの位置をバーの中央にしてバーが移動するようになります。

バーにボールが当たったら反射させよう
バーが動くだけではまだゲームとしての機能が十分ではありません。次はボールがバーに当たったときに「跳ね返る」ようにする処理を追加していきます。
この処理によってプレイヤーがボールを受け止めて打ち返すことが可能になり、ゲームとしての操作性がぐっと高まります。
バーに当たったときにただ反射するだけではなく、当たった位置によって跳ね返る角度を変えるようにすると、より自然な動きになります。
今回は以下のようにしてそれを実現しました。
ball_rect.x + 15はボールの中心x座標(幅30ピクセルなので +15)bar_rect.x + 50はバーの中心x座標(幅100ピクセルなので +50)- この差を4で割ることでバーの中心からのずれ量を計り、それをvxに与える
(ずれ量が大きいほどvxも大きくなる) vyはランダムで負の値(-10から-5)を与える
まとめ
今回はブロック崩しゲームにおける「バー」の実装を行いました。
バーはプレイヤーがボールを跳ね返すために使う重要な要素であり、ゲームの操作性を左右するパーツです。
この実装によりプレイヤーが実際に操作できるゲームらしい動きが加わり、ブロック崩しの土台がしっかりと出来上がってきました。
次回はボールが画面の下まで落ちてしまったときに「ゲームオーバー」になる処理を追加していきます。
ゲームとしての緊張感が一気に高まる要素ですので、ぜひ楽しみにしていてください。
お疲れさまでした!この調子で少しずつゲームを完成させていきましょう。
- Chapter4-2の完成コード
-
今回の記事での完成するコード全体は↓↓の通りです。
必要な方は開いて確認しましょう。
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 ## バーの設定 bar_rect = pygame.Rect(400, 550, 100, 10) ## ブロックの設定 ## リプレイボタンの設定 ## メインループ内で使う変数 pushFlag = False page = 1 score = 0 # ここから各関数の定義 ## ゲームステージ関数 def gamestage(): # 画面の初期化 global vx, vy, page, score screen.blit(haikei_img, (0,0)) # ユーザー入力 (mx, my) = pygame.mouse.get_pos() # ボールの処理 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 if bar_rect.colliderect(ball_rect): # もしバーがボールと衝突したら vx = ((ball_rect.x + 15) - (bar_rect.x + 50)) / 4 vy = random.randint(-10, -5) ball_rect.x += vx ball_rect.y += vy pygame.draw.circle(screen, (pygame.Color("GOLD")), ball_rect.center, ball_rect.width // 2) # バーの処理 bar_rect.x = mx - 50 pygame.draw.rect(screen, pygame.Color("BLUE"),bar_rect) # ブロックの処理 ## ジャンプ関数(ボタンが押されたら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()


