ながみえ

一つ前のページでは衝突判定の基本について学習しました。

今回は 画面に敵を配置する方法 について見ていきましょう。

Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう
 ・Chapter3-1:衝突判定に基本を理解しよう
 ・Chapter3-2:画面に敵を配置しよう ◁今回はここ
 ・Chapter3-3:ゲームオーバーを設定しよう
 ・Chapter3-4:ゲームクリアを設定しよう
 ・Chapter3-5:追跡してくる敵を実装しよう
Chapter4:ブロック崩しを作ろう
Chapter5:シューティングゲームを作ろう
Chapter6:pygameのお役立ち情報

前回のChapter3-1では、ゲーム画面上でプレイヤーキャラクターの猫を自由に動かす処理を実装しました。

矢印キーによって猫が上下左右に移動し、壁にぶつからないように制限する処理も加えたことで、画面内を自由に移動できるようになりました。

今回のChapter3-2では、アクションゲームの醍醐味ともいえる「敵キャラクター」の登場です。まずは、猫の前に立ちはだかる「犬の敵キャラ」を画面に表示する方法を学びましょう。

敵キャラを登場させるには、画像を読み込んで画面に表示する処理が必要です。

また、ゲーム内に1体だけでなく複数の敵を出現させるために「リスト」や「for文」といったPythonの基本的な構文も登場します。

これから少しずつゲームらしさが増していきますので、ぜひ楽しみながら進めていきましょう!

注意点

Chapter3-1から3-5でまでを通して1つのゲームを作成しています。

直接このページに来た人は pygameのトップページ から基本セットを 無料 でダウンロードしてChapter3-1から学習を始めるか、以下のコードをコピーしてください。

Q
Chapter3-1の完成コード
# 初期化(ゲームの準備をする)
import pygame, sys, random
pygame.init()
screen = pygame.display.set_mode((800,600))
## 背景画像の設定
haikei_img = pygame.image.load("images/shibafu.png")
haikei_img = pygame.transform.scale(haikei_img, (800, 600))
## プレイヤーの猫の設定
neko_imgR = pygame.image.load("images/neko.png")
neko_imgR = pygame.transform.scale(neko_imgR, (50,50))
neko_imgL = pygame.transform.flip(neko_imgR, True, False)
neko_rect = pygame.Rect(50,50,50,50) # 猫のRect
## 敵の犬の設定

## 敵の幽霊の設定

## ゴールの設定

# 壁の設定(四辺に配置)
walls = [
    pygame.Rect(0, 0, 800, 20),    # 上の壁
    pygame.Rect(0, 0, 20, 600),    # 左の壁
    pygame.Rect(780, 0, 20, 600),  # 右の壁
    pygame.Rect(0, 580, 800, 20)   # 下の壁
]
## リセットボタンの設定


## メインループ内で使う変数
rightFlag = True # 猫の向き
     # リセットボタンが押されたか
     # 表示するページ(1:ゲーム画面、2:ゲームオーバー画面、3、ゲームクリア画面)


# ここから関数の定義
## ゲームステージ
def gamestage():
    global rightFlag
    global page
    # 画面の初期化
    screen.blit(haikei_img, (0,0))
    # 猫の移動量
    vx = 0
    vy = 0
    #ユーザー入力
    key = pygame.key.get_pressed()
    if key[pygame.K_RIGHT]: # 右キーが押されたら右へ移動
        vx = 4
        rightFlag = True
    if key[pygame.K_LEFT]:  # 左キーが押されたら左へ移動
        vx = -4
        rightFlag = False
    if key[pygame.K_UP]:    # 上キーが押されたら上へ移動
        vy = -4
    if key[pygame.K_DOWN]:  # 下キーが押されたら下へ移動
        vy = 4

    # 猫の処理
    neko_rect.x += vx
    neko_rect.y += vy
    # 猫と壁との衝突判定
    if neko_rect.collidelist(walls) != -1: # もし猫が壁と衝突していたら
        neko_rect.x -= vx
        neko_rect.y -= vy
    # 猫の向きの指定
    if rightFlag: 
        screen.blit(neko_imgR, neko_rect)
    else:
        screen.blit(neko_imgL, neko_rect)
    ## 犬の処理

    ## 幽霊の処理

    ## ゴールの処理

    ## 壁の処理
    for wall in walls:   # wallsリストの全要素(壁のRect)
        pygame.draw.rect(screen, pygame.Color("DARKGREEN"),wall)


## ジャンプ関数(ボタンが押されたら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()

Chapter3-4の記事の末尾にある完成コードをコピーしておいてください。

<<前のページ

pygameの記事一覧

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

次のページ>>

敵キャラ用の画像を読み込む手順

まずは、敵キャラクターとして表示する犬の画像を準備しましょう。

ゲームで画像を表示するには、pygameのimage.load()関数を使って画像ファイルを読み込みます。

さらに、表示サイズが大きすぎたり小さすぎたりする場合には、transform.scale()を使って画像サイズを調整する必要があります。

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

ここでは「inu.png」という犬の画像ファイルを使用します。あらかじめimagesフォルダにこのファイルが入っていることを確認してください。

以下のコードを見てみましょう。

コードを書いてみよう

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

## 敵の犬の設定
enemy_img = pygame.image.load("images/inu.png")  # 犬の画像を読み込む
enemy_img = pygame.transform.scale(enemy_img, (50, 50))  # 画像サイズを50x50ピクセルに変更

このコードでは、最初にpygame.image.load()を使って画像ファイルを読み込んでいます。画像ファイルのパスが間違っているとエラーになるので注意しましょう。

次にpygame.transform.scale()を使って、画像のサイズを縦横50ピクセルに調整しています。こうすることで、画面上でちょうど良い大きさの敵キャラとして表示できるようになります。

画像の準備ができたら、次はこの敵キャラを複数表示するために、リストを使って位置を管理する処理に進みます。

複数の敵をリストで管理しよう

ゲームをより面白くするには、敵キャラクターが1体だけでなく、たくさん出てくる方が楽しいですよね。ここでは、犬の敵キャラを複数体表示する方法を解説します。

そのためにはリストという仕組みを使います。

リストとは、複数のデータ(この場合は犬の位置情報)を一つの変数でまとめて管理できるPythonの基本的な機能です。

リストを使って、たくさんの犬の「位置情報(Rect)」を順番に保存しておくことで、for文でまとめて処理することができます。

コードを書いてみよう

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

先ほど書き足した「敵の犬の設定」の次の行から書いてOKです。

enemys = []  # 犬の位置情報を格納する空のリストを作る
for i in range(13):  # 13体の敵を生成
    wx = 100 + i * 50  # 横方向に等間隔で配置
    wy = random.randint(20, 550)  # 縦の位置はランダムに
    enemys.append(pygame.Rect(wx, wy, 50, 50))  # リストに敵のRect(位置と大きさ)を追加

このコードでは、まずenemysという空のリストを用意し、その中にループ処理を使って13体の犬の位置を設定していきます。

  • wxは横方向の座標で、iに応じて50ピクセルずつずらしています。こうすることで、犬たちが横に並ぶようになります。
  • wyは縦方向の座標で、random.randint(20, 550)を使ってランダムな位置にしています。

最後に、pygame.Rect()を使って敵の当たり判定エリア(位置と大きさ)を作成し、それをリストenemysに追加しています。

このようにして、敵キャラの情報を1つのリストにまとめて管理することで、後からまとめて描画したり、衝突判定を行ったりするのが簡単になります。

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

敵をランダムに配置して画面に表示する

複数の敵キャラの位置情報(Rect)をリストで管理できるようになりました。

次はそれぞれの敵キャラに画像を対応させて、実際にゲーム画面に表示する処理を作っていきましょう。

画像を画面に描画するには、screen.blit()という関数を使います。これは、画像とその表示位置を指定して画面上に描くための関数です。

複数の敵を表示するには、リストの中にあるすべての敵キャラのRectをひとつずつ取り出して描画していく必要があります。そのために、Pythonのfor文を使います。

コードを書いてみよう

action.py の gamestage関数 の中に以下のコードを書き足しましょう。

## 犬の処理
for enemy in enemys:  # enemysリストの全要素(敵のRect)を順に取り出す
    screen.blit(enemy_img, enemy)  # 敵画像を対応する位置に表示

このように「for enemy in enemys」と書くことで、リストに格納されているすべての敵Rectを順番に取り出すことができます。

それぞれのRect(enemy)に対してscreen.blit(enemy_img, enemy)を実行することで、敵キャラの画像を画面上に表示できます。

この処理を、ゲーム画面を描画するgamestage()関数の中に追加することで、毎フレーム敵キャラが描画されるようになります。リストとfor文の組み合わせによって、どれだけ敵が増えても簡単に管理・表示できるようになります。

これで、敵キャラクターが画面に現れるようになり、ゲームらしさが一気にアップしました!

まとめ

今回はアクションゲームに欠かせない「敵キャラクター」を画面に表示する方法を学びました。

画像ファイルの読み込み方法や、複数の敵を管理するためのリストの使い方、そしてそれをループで描画するテクニックまで、一歩ずつ実装を進めてきましたね。

前回までのシンプルな操作画面が、一気に“ゲームらしい見た目”へと進化したことを実感できたのではないでしょうか。

今回のステップではまだ敵に当たっても何も起こりませんが、次回のChapter3-3では、いよいよ「敵に当たったらゲームオーバーになる」処理を実装します。

プレイヤーに緊張感を与える重要な機能ですので、引き続き楽しく取り組んでいきましょう!

お疲れさまでした!

Q
Chapter3-2の完成コード

今回の記事での完成するコード全体は↓↓の通りです。

必要な方は開いて確認しましょう。

# 初期化(ゲームの準備をする)
import pygame, sys, random
pygame.init()
screen = pygame.display.set_mode((800,600))
## 背景画像の設定
haikei_img = pygame.image.load("images/shibafu.png")
haikei_img = pygame.transform.scale(haikei_img, (800, 600))
## プレイヤーの猫の設定
neko_imgR = pygame.image.load("images/neko.png")
neko_imgR = pygame.transform.scale(neko_imgR, (50,50))
neko_imgL = pygame.transform.flip(neko_imgR, True, False)
neko_rect = pygame.Rect(50,50,50,50) # 猫のRect
## 敵の犬の設定
enemy_img = pygame.image.load("images/inu.png")  # 犬の画像を読み込む
enemy_img = pygame.transform.scale(enemy_img, (50, 50))  # 画像サイズを50x50ピクセルに変更
enemys = []  # 犬の位置情報を格納する空のリストを作る
for i in range(13):  # 13体の敵を生成
    wx = 100 + i * 50  # 横方向に等間隔で配置
    wy = random.randint(20, 550)  # 縦の位置はランダムに
    enemys.append(pygame.Rect(wx, wy, 50, 50))  # リストに敵のRect(位置と大きさ)を追加
## 敵の幽霊の設定

## ゴールの設定

# 壁の設定(四辺に配置)
walls = [
    pygame.Rect(0, 0, 800, 20),    # 上の壁
    pygame.Rect(0, 0, 20, 600),    # 左の壁
    pygame.Rect(780, 0, 20, 600),  # 右の壁
    pygame.Rect(0, 580, 800, 20)   # 下の壁
]
## リセットボタンの設定


## メインループ内で使う変数
rightFlag = True # 猫の向き
     # リセットボタンが押されたか
     # 表示するページ(1:ゲーム画面、2:ゲームオーバー画面、3、ゲームクリア画面)


# ここから関数の定義
## ゲームステージ
def gamestage():
    global rightFlag
    global page
    # 画面の初期化
    screen.blit(haikei_img, (0,0))
    # 猫の移動量
    vx = 0
    vy = 0
    #ユーザー入力
    key = pygame.key.get_pressed()
    if key[pygame.K_RIGHT]: # 右キーが押されたら右へ移動
        vx = 4
        rightFlag = True
    if key[pygame.K_LEFT]:  # 左キーが押されたら左へ移動
        vx = -4
        rightFlag = False
    if key[pygame.K_UP]:    # 上キーが押されたら上へ移動
        vy = -4
    if key[pygame.K_DOWN]:  # 下キーが押されたら下へ移動
        vy = 4

    # 猫の処理
    neko_rect.x += vx
    neko_rect.y += vy
    # 猫と壁との衝突判定
    if neko_rect.collidelist(walls) != -1: # もし猫が壁と衝突していたら
        neko_rect.x -= vx
        neko_rect.y -= vy
    # 猫の向きの指定
    if rightFlag: 
        screen.blit(neko_imgR, neko_rect)
    else:
        screen.blit(neko_imgL, neko_rect)
    ## 犬の処理
    for enemy in enemys:  # enemysリストの全要素(敵のRect)を順に取り出す
        screen.blit(enemy_img, enemy)  # 敵画像を対応する位置に表示
    ## 幽霊の処理

    ## ゴールの処理

    ## 壁の処理
    for wall in walls:   # wallsリストの全要素(壁のRect)
        pygame.draw.rect(screen, pygame.Color("DARKGREEN"),wall)


## ジャンプ関数(ボタンが押されたら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をコピーしました