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

ながみえ
本記事には広告(アフィリエイトリンク)が含まれます。リンク経由で申込が発生した場合、当サイトが報酬を受け取る可能性があります。

一つ前のチャプターでは壁に反射するボールを設置しました。

今回は ボールを反射させるバー を設置しましょう。

【Pygame入門編】
Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう

【Pygame実践編】
Extra1:ブロック崩しを作ろう
 ・Extra1-1:ボールを壁に反射させよう
 ・Extra1-2:反射させるバーを設置しよう ◁今回はここ
 ・Extra1-3:ボールが画面下に落ちたらゲームオーバーにしよう
 ・Extra1-4:ぶつかると消えるブロックを配置しよう
Extra2:シューティングゲームを作ろう
Extra3:オセロ(リバーシ)を作ろう
Extra4:ナインゲームを作ろう
Extra5:横スクロールのアクションゲームを作ろう

前回はボールが画面の端に当たったときに反射する処理を追加し、画面内を跳ね回るようにしました。

今回は、いよいよプレイヤーが操作する「バー」を追加していきます。

ブロック崩しゲームではこのバーがプレイヤーの操作の中心になります。バーを左右に動かし、落ちてくるボールを跳ね返してブロックを壊していくのがゲームの基本的な流れです。

今回のチャプターでは、以下のことができるようになります。

  • 画面下にバーを表示する
  • バーをマウスで操作できるようにする
  • バーにボールが当たったら、ボールが跳ね返るようにする

それでは順を追って解説していきましょう。

あわせて読みたい
Pygameで使える関数・メソッド・クラス一覧まとめ【Pythonゲーム制作リファレンス】
Pygameで使える関数・メソッド・クラス一覧まとめ【Pythonゲーム制作リファレンス】

<<前のページ

pygameの記事一覧

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

次のページ>>

バーを画面に表示しよう

それではまず、バーを画面上に表示してみましょう。

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

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

Rectとは何か?

Rect は四角形の位置とサイズを表すためのオブジェクトです。以下のような書き方で使います。

pygame.Rect(左上のx座標, 左上のy座標, 横幅, 高さ)

今回のバーは、画面の下部に配置しましょう。

コードを書いてみよう

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

## バーの設定
bar_rect = pygame.Rect(400, 550, 100, 10)

このコードでは以下のようなバーが作成されます。

  • 横位置(x座標)を400
  • 縦位置(y座標)を550(画面下部)
  • 幅を100ピクセル
  • 高さを10ピクセル

画面にバーを表示するには?

バーを画面に表示するには、pygame.draw.rect() を使います。この関数は指定した色と Rect の情報をもとに、画面上に四角形を描画します。

コードを書いてみよう

「## ゲームステージ関数」の中に以下のコードを書き足しましょう。

# バーの処理
# ここにあとで「マウスの位置にバーを合わせるコード」を追加
pygame.draw.rect(screen, pygame.Color("BLUE"), bar_rect)

これでバーが画面下部に表示されるようになります。

マウスでバーを動かそう

バーを画面に表示できたら、次はそのバーをプレイヤーが操作できるようにしましょう。

今回は、マウスの動きに連動してバーが左右に動くようにします。これにより、プレイヤーはマウスを使って直感的に操作できるようになります。

コードを書いてみよう

「## ゲームステージ関数」の中に以下のコードを書き足しましょう。

# ユーザー入力
(mx, my) = pygame.mouse.get_pos()

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

bar_rect.x = mx - 50 # マウスの位置を合わせる

バーの中心をマウスカーソルに合わせるには、バーのx座標をマウスのx座標からバーの半分の長さを引いた値にします。

バーの幅は100ピクセルなので、「bar_rect.x = mx – 50」となる訳です。

これにより、マウスカーソルの位置をバーの中央にしてバーが移動するようになります。

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

バーにボールが当たったら反射させよう

バーが動くだけではまだゲームとしての機能が十分ではありません。次はボールがバーに当たったときに「跳ね返る」ようにする処理を追加していきます。

この処理によってプレイヤーがボールを受け止めて打ち返すことが可能になり、ゲームとしての操作性がぐっと高まります。

コードを書いてみよう

「## ゲームステージ関数」の中の「# ボールの処理」の部分に以下のコードを書き足してください。

if bar_rect.colliderect(ball_rect): # もしバーがボールと衝突したら
    vx = ((ball_rect.x + 15) - (bar_rect.x + 50)) / 4
    vy = random.randint(-10, -5)

バーに当たったときにただ反射するだけではなく、当たった位置によって跳ね返る角度を変えるようにすると、より自然な動きになります。

今回は以下のようにしてそれを実現しました。

  • ball_rect.x + 15 はボールの中心x座標(幅30ピクセルなので +15)
  • bar_rect.x + 50 はバーの中心x座標(幅100ピクセルなので +50)
  • この差を4で割ることでバーの中心からのずれ量を計り、それをvxに与える
    (ずれ量が大きいほどvxも大きくなる)
  • vy はランダムで負の値(-10から-5)を与える

まとめ

今回はブロック崩しゲームにおける「バー」の実装を行いました。

バーはプレイヤーがボールを跳ね返すために使う重要な要素であり、ゲームの操作性を左右するパーツです。

この実装によりプレイヤーが実際に操作できるゲームらしい動きが加わり、ブロック崩しの土台がしっかりと出来上がってきました。

次回はボールが画面の下まで落ちてしまったときに「ゲームオーバー」になる処理を追加していきます。

ゲームとしての緊張感が一気に高まる要素ですので、ぜひ楽しみにしていてください。

お疲れさまでした!この調子で少しずつゲームを完成させていきましょう。

Q
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()
もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいpygame学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

pygameの記事一覧

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

次のページ>>

記事URLをコピーしました