ながみえ
pygameを使用して簡単なノベルゲームを作成する方法を紹介する記事のアイキャッチ画像

一つ前のページでは簡単な紙芝居を作る方法について学習しました。

今回は 簡単なノベルゲームを作る方法 について見ていきましょう。

Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
・Chapter2-1:キーボードでキャラクターを動かそう
・Chapter2-2:マウスでキャラクターを動かそう
・Chapter2-3:画面にボタンを表示しよう
・Chapter2-4:紙芝居を作ろう
・Chapter2-5:ノベルゲームを作ろう ◁今回はここ
Chapter3:簡単なアクションゲームを作ろう
Chapter4:ブロック崩しを作ろう
Chapter5:シューティングゲームを作ろう
Chapter6:pygameのお役立ち情報

前回の記事では、「紙芝居」のように複数の画像を切り替えながらストーリーを進める方法を学びました。

関数を使って1ページずつ整理し、ボタンを押すことで次のページに進める仕組みを作りましたね。

今回はその紙芝居を少しレベルアップさせて、「選択肢」によってストーリーが分岐するノベルゲームを作っていきます。

選んだ選択肢によって違う展開になったり、エンディングが変わったりする仕組みを作ることで、よりゲームらしく、プレイヤーが楽しめる作品になります。

前回までに学んだ「画像の表示」や「ボタンを押す処理」といった内容を組み合わせて、完成度の高いノベルゲームに挑戦してみましょう!

<<前のページ

pygameの記事一覧

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

次のページ>>

Pythonの学習の区切りを表し、記事一覧へ戻ることを促す画像

ノベルゲームの基礎と実装概要

ノベルゲームとは、文章や画像を中心に物語が進行していくゲームジャンルです。

プレイヤーは、画面に表示されたストーリーを読み進めながら、途中に現れる「選択肢」を選ぶことで、その後の展開を変えていきます。

ゲームシステム自体は非常にシンプルで、ストーリーさえ用意できれば初心者でも簡単に作ることができます。

学習を始める前に、以下のダウンロードリンクをクリックし、ノベルゲームセット(5枚の背景画像と4種類のボタン画像)をダウンロードしておいてください。

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

ノベルゲームのストーリー

ノベルゲームを作成するためにはストーリーが必要です。

今回はゲームの仕組みを理解することが目的ですので、極めて簡単なストーリを用意しました。作成を始める前に、まずこのストーリーを把握しましょう。

1.スタート画面(選択肢1)

あなたは学校からの帰り道、かわいい子猫を見つけました。
子猫は道の隅で寂しそうに鳴いています。どうしますか?

  • 撫でる(②へ)
  • 無視する(③へ)

2.選択肢2

子猫はあなたになつき、一緒に家に向かいます。
しかし途中で道が二手に分かれています。どちらの道を選びますか?

  • 明るく賑やかな道(④へ)
  • 暗く静かな近道(⑤へ)

3.ゲームオーバー1

あなたは子猫を無視して歩き出しましたが、後ろ髪を引かれます。
振り返ると子猫はもうそこにいませんでした。
「少しだけ優しくすればよかった」とあなたは後悔しながら家に帰りました。

4.ゲームクリア

明るい道を進むと子猫の飼い主らしき女の子が、必死に探している姿が見えました。
子猫を無事に女の子に返すことができ、あなたはお礼を言われました。
心が温かくなり、気持ちよく帰宅することができました。

5.ゲームオーバー2

暗く静かな近道を選ぶと、突然子猫が何かに驚いて走り去ってしまいました。
あなたは追いかけましたが見失ってしまい、心配と悲しさを抱えながら帰ることになりました。

ノベルゲームのベースを作ろう

ノベルゲームを作るには、まず「物語の1ページ目を表示する画面」からスタートするのが基本です。

ここではあらかじめ用意された画像を背景として表示するだけのシンプルなプログラムを作成します。

このコードは、今後追加していく機能の“土台”になります。(ダウンロードしたフォルダにも同じものが入っています。

ここまで学習してきたあなたはこのコードは全て理解できるはずです。まずはこれを実行し、ゲーム画面を表示させてみてください。

# 初期化(ゲームの準備をする)
import pygame, sys
pygame.init()
screen = pygame.display.set_mode((800, 600))

# 各画面の設定
img1 = pygame.image.load("images/novel1.png")
img1 = pygame.transform.scale(img1, (800, 600))

## 選択肢の画面の設定

## 変数の設定
pushFlag = False
page = 1

# ここから関数の定義
## ボタンを押したら次のページにジャンプする関数

## 1ページ目を表示する関数
def page1():
    screen.blit(img1, (0,0))

## 2ページ目を表示する関数

## 3ページ目を表示する関数

## 4ページ目を表示する関数

## 5ページ目を表示する関数

# メインループ
while True:
    page1()
    # 画面表示
    pygame.display.update()
    pygame.time.Clock().tick(60)
    # 終了処理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

この時点では、ただ1ページ目の画像を表示するだけのシンプルな構造になっています。

これからここに「選択肢のボタン」や「ページの切り替え処理」などを追加していくことで、物語の分岐ができるようになります。

もし「このコードの内容がよく分からない…」という場合は、過去の記事へ戻って復習をしましょう↓↓

あわせて読みたい
PythonとPygameで始めるゲーム制作|初心者の学習を楽しくステップアップ!
PythonとPygameで始めるゲーム制作|初心者の学習を楽しくステップアップ!

選択肢ボタンの画像を準備しよう

前のセクションでは、ノベルゲームの1ページ目を表示するだけのベースプログラムを作成しました。ここからは、プレイヤーが選べる「選択肢」を画面に表示していきます。

選択肢は、クリック可能なボタン画像として表示し、プレイヤーがどの選択肢を選んだかによって物語が分岐していく仕組みを作ります。

まずは、ボタンとして使う画像ファイルを読み込むコードを追加していきましょう。

コードを書いてみよう

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

# 選択肢の画面の設定
sentakushiA_img = pygame.image.load("images/sentakushiA.png")  # 選択肢Aのボタン画像
sentakushiA_img = pygame.transform.scale(sentakushiA_img, (108, 30))  # サイズ調整

sentakushiB_img = pygame.image.load("images/sentakushiB.png")  # 選択肢Bのボタン画像
sentakushiB_img = pygame.transform.scale(sentakushiB_img, (108, 30))  # サイズ調整

gameclear_img = pygame.image.load("images/gameclear.png")  # ゲームクリアの画像
gameclear_img = pygame.transform.scale(gameclear_img, (300, 30))  # サイズ調整

gameover_img = pygame.image.load("images/gameover.png")  # ゲームオーバーの画像
gameover_img = pygame.transform.scale(gameover_img, (300, 30))  # サイズ調整

コードの解説

  • pygame.image.load() は画像ファイルを読み込む関数
  • pygame.transform.scale() は画像のサイズを変更する関数。
  • sentakushiA_imgsentakushiB_img は選択肢のボタンとして使用する画像
  • gameclear_imggameover_img はエンディング後に最初に戻るための画像

注意点

  • ファイル名が異なっていたり、フォルダの場所が間違っていたりすると、エラーが発生します。実行時に「FileNotFoundError」が出た場合は、ファイルのパスを確認しましょう。
  • 画像ファイルは、すべてimagesフォルダの中に保存されている必要があります。
【Python】勉強猫がノートパソコンを見ながら考え込む様子。記事内の休憩用イラスト

選択肢の分岐を処理する関数を作ろう

選択肢として使うボタン画像を読み込みましたので、それらのボタンを実際にクリックできるようにし、クリックされたボタンによって物語のページを切り替える仕組みを作っていきましょう。

クリックによる分岐の仕組み

ノベルゲームでは、選択肢を選ぶと次のページに進む必要があります。

ここでは、マウスのクリック位置がボタン画像の範囲内であるかを判定し、該当するページにジャンプさせる関数を作成します。

このような処理は何度も使うので、関数にまとめておくと便利です。

ボタンを押したらページを切り替える関数

コードを書いてみよう

以下のコードを「# ここから関数の定義」の部分に書き足しましょう。

## ボタンを押したら次のページにジャンプする関数
def button_to_jump(btn, newpage):
    global page, pushFlag
    # マウスのボタン状態を取得(0:左クリック, 1:中ボタン, 2:右クリック)
    mdown = pygame.mouse.get_pressed()
    # マウスの座標を取得
    (mx, my) = pygame.mouse.get_pos()

    if mdown[0]:  # 左クリックが押された場合
        # btn(ボタン画像)の範囲内がクリックされていて、かつ前のフレームで押されていなければ
        if btn.collidepoint(mx, my) and pushFlag == False:
            page = newpage  # 指定されたページ番号に切り替える
            pushFlag = True  # 連続クリックを防ぐためにフラグを立てる
    else:
        pushFlag = False  # マウスを離したらフラグをリセット
  • btn.collidepoint(mx, my) はマウスの座標がボタンの範囲内にあるかどうかを調べる。
  • pushFlag はクリックの“押しっぱなし”による連続反応を防ぐための変数。一度クリックしたらTrueにして、マウスを離したらFalseに戻す。
  • newpage はクリックされたときに遷移するページ番号。

この関数を使うことでどのボタンがクリックされたかを判断し、それに応じてpage変数を更新することができます。

複数ページの表示と遷移を作成しよう

選択肢をクリックしたときにページを切り替えるための関数 button_to_jump() ができたので、これを使用して実際にページごとに異なる画面を表示する関数を作っていきます。

ノベルゲームでは、ページごとに異なる背景画像や選択肢が表示されます。ページごとの内容をまとめることで、ゲームの進行を整理しやすくなります。

複数ページの背景画像を読み込もう

まず、ページごとの背景画像(novel2.pngnovel5.png)を追加読み込みしましょう。

コードを書いてみよう

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

「img1=・・・」の行の下です。

img2 = pygame.image.load("images/novel2.png")
img2 = pygame.transform.scale(img2, (800, 600))
img3 = pygame.image.load("images/novel3.png")
img3 = pygame.transform.scale(img3, (800, 600))
img4 = pygame.image.load("images/novel4.png")
img4 = pygame.transform.scale(img4, (800, 600))
img5 = pygame.image.load("images/novel5.png")
img5 = pygame.transform.scale(img5, (800, 600))

各ページを表示する関数を定義しよう

次に、page1()page5()までの関数をすべて定義していきます。
それぞれのページで表示する画像や選択肢を変えることで、物語の流れを作っていきます。

コードを書いてみよう

以下のコードを「# ここから関数の定義」の部分に書き足しましょう。

その後、同様の手順でpage2()からpage5()までの関数を考えて、下に書き足してみてください。

## 1ページ目を表示する関数
def page1():
    screen.blit(img1, (0,0))
    btn1 = screen.blit(sentakushiA_img, (35, 492))  # 選択肢A
    btn2 = screen.blit(sentakushiB_img, (35, 535))  # 選択肢B
    button_to_jump(btn1, 2)  # Aを押すと2ページ目へ
    button_to_jump(btn2, 3)  # Bを押すと3ページ目へ
  • ページごとに screen.blit() によって背景画像を表示します。
  • screen.blit() の返り値(btn1btn2)を使って、どの領域がボタンなのかを判断している。
  • 各ページの選択肢ごとに button_to_jump() を呼び出し、どのページへ進むかを制御している。

これで、プレイヤーの選択によって物語が分岐し、さらにそれぞれのエンディング(ゲームクリア / ゲームオーバー)に到達するというノベルゲームの基本構成が整いました。

【Python】勉強猫がコーヒーを片手にリラックスしている様子。記事内の休憩用イラスト

メインループを更新しよう

各ページに対応する関数(page1()page5())を用意し、プレイヤーの選択によって物語が分岐する構造が完成しました。

今回は、今どのページにいるか を判定して、それに応じたページ関数を呼び出すメインループの処理を完成させます。

コードを書いてみよう

以下のコードを「# メインループ」の部分に書き足しましょう。

# メインループ
while True:
    if page == 1:
        page1()
    elif page == 2:
        page2()
    elif page == 3:
        page3()
    elif page == 4:
        page4()
    elif page == 5:
        page5()

まとめ

今回は、「選択肢によって展開が変わるノベルゲーム」の基本的な作り方を学びました。

この章を通して、画面の切り替えや選択肢処理の基本 を身につけることができました。この仕組みを応用すれば、もっと複雑な分岐やストーリー、セーブ・ロード機能などを追加していくことも可能になります。

自分だけのオリジナルストーリーを作って、より魅力的なノベルゲームに発展させてみてください!

ここまでお疲れさまでした。次回も楽しんで進めていきましょう!

<<前のページ

pygameの記事一覧

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

次のページ>>

Pythonの学習の区切りを表し、記事一覧へ戻ることを促す画像

「FAQ|ノベルゲームの分岐処理

Q
Q1. 選択肢で分岐させたはずなのに同じページが表示されます。

ボタン押下時に遷移先のページ変数が正しく更新されていない可能性があります。クリックイベント後の処理を見直してください。

Q
Q2. 分岐先のページを増やすにはどうしたらいい?

各ページを関数で分けて管理し、それぞれに条件分岐を設定すればスムーズにページ数を増やすことができます。

Q
Q3. ボタンを押してもページが変わらない時の対処法は?

blit()で新しい画像を描画していても、pygame.display.update()を忘れると画面に反映されません。描画の更新を忘れずに行いましょう。

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

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

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

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

記事URLをコピーしました