一つ前のページでは簡単な紙芝居を作る方法について学習しました。
今回は 簡単なノベルゲームを作る方法 について見ていきましょう。
Chapter1:pygame入門|画面を表示しよう
Chapter2:簡単なノベルゲームを作ろう
・Chapter2-1:キーボードでキャラクターを動かそう
・Chapter2-2:マウスでキャラクターを動かそう
・Chapter2-3:画面にボタンを表示しよう
・Chapter2-4:紙芝居を作ろう
・Chapter2-5:ノベルゲームを作ろう ◁今回はここ
Chapter3:簡単なアクションゲームを作ろう
Chapter4:ブロック崩しを作ろう
Chapter5:シューティングゲームを作ろう
Chapter6:pygameのお役立ち情報
前回の記事では、「紙芝居」のように複数の画像を切り替えながらストーリーを進める方法を学びました。
関数を使って1ページずつ整理し、ボタンを押すことで次のページに進める仕組みを作りましたね。
今回はその紙芝居を少しレベルアップさせて、「選択肢」によってストーリーが分岐するノベルゲームを作っていきます。
選んだ選択肢によって違う展開になったり、エンディングが変わったりする仕組みを作ることで、よりゲームらしく、プレイヤーが楽しめる作品になります。
前回までに学んだ「画像の表示」や「ボタンを押す処理」といった内容を組み合わせて、完成度の高いノベルゲームに挑戦してみましょう!
ノベルゲームの基礎と実装概要
ノベルゲームとは、文章や画像を中心に物語が進行していくゲームジャンルです。
プレイヤーは、画面に表示されたストーリーを読み進めながら、途中に現れる「選択肢」を選ぶことで、その後の展開を変えていきます。
ゲームシステム自体は非常にシンプルで、ストーリーさえ用意できれば初心者でも簡単に作ることができます。
学習を始める前に、以下のダウンロードリンクをクリックし、ノベルゲームセット(5枚の背景画像と4種類のボタン画像)をダウンロードしておいてください。
ノベルゲームのストーリー
ノベルゲームを作成するためにはストーリーが必要です。
今回はゲームの仕組みを理解することが目的ですので、極めて簡単なストーリを用意しました。作成を始める前に、まずこのストーリーを把握しましょう。
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ページ目の画像を表示するだけのシンプルな構造になっています。
これからここに「選択肢のボタン」や「ページの切り替え処理」などを追加していくことで、物語の分岐ができるようになります。
もし「このコードの内容がよく分からない…」という場合は、過去の記事へ戻って復習をしましょう↓↓
選択肢ボタンの画像を準備しよう
前のセクションでは、ノベルゲームの1ページ目を表示するだけのベースプログラムを作成しました。ここからは、プレイヤーが選べる「選択肢」を画面に表示していきます。
選択肢は、クリック可能なボタン画像として表示し、プレイヤーがどの選択肢を選んだかによって物語が分岐していく仕組みを作ります。
まずは、ボタンとして使う画像ファイルを読み込むコードを追加していきましょう。
コードの解説
pygame.image.load()
は画像ファイルを読み込む関数pygame.transform.scale()
は画像のサイズを変更する関数。sentakushiA_img
やsentakushiB_img
は選択肢のボタンとして使用する画像gameclear_img
とgameover_img
はエンディング後に最初に戻るための画像
注意点
- ファイル名が異なっていたり、フォルダの場所が間違っていたりすると、エラーが発生します。実行時に「FileNotFoundError」が出た場合は、ファイルのパスを確認しましょう。
- 画像ファイルは、すべて
images
フォルダの中に保存されている必要があります。
選択肢の分岐を処理する関数を作ろう
選択肢として使うボタン画像を読み込みましたので、それらのボタンを実際にクリックできるようにし、クリックされたボタンによって物語のページを切り替える仕組みを作っていきましょう。
クリックによる分岐の仕組み
ノベルゲームでは、選択肢を選ぶと次のページに進む必要があります。
ここでは、マウスのクリック位置がボタン画像の範囲内であるかを判定し、該当するページにジャンプさせる関数を作成します。
このような処理は何度も使うので、関数にまとめておくと便利です。
ボタンを押したらページを切り替える関数
btn.collidepoint(mx, my)
はマウスの座標がボタンの範囲内にあるかどうかを調べる。pushFlag
はクリックの“押しっぱなし”による連続反応を防ぐための変数。一度クリックしたらTrue
にして、マウスを離したらFalse
に戻す。newpage
はクリックされたときに遷移するページ番号。
この関数を使うことでどのボタンがクリックされたかを判断し、それに応じてpage
変数を更新することができます。
複数ページの表示と遷移を作成しよう
選択肢をクリックしたときにページを切り替えるための関数 button_to_jump()
ができたので、これを使用して実際にページごとに異なる画面を表示する関数を作っていきます。
ノベルゲームでは、ページごとに異なる背景画像や選択肢が表示されます。ページごとの内容をまとめることで、ゲームの進行を整理しやすくなります。
複数ページの背景画像を読み込もう
まず、ページごとの背景画像(novel2.png
〜 novel5.png
)を追加読み込みしましょう。
各ページを表示する関数を定義しよう
次に、page1()
〜page5()
までの関数をすべて定義していきます。
それぞれのページで表示する画像や選択肢を変えることで、物語の流れを作っていきます。
- ページごとに
screen.blit()
によって背景画像を表示します。 screen.blit()
の返り値(btn1
やbtn2
)を使って、どの領域がボタンなのかを判断している。- 各ページの選択肢ごとに
button_to_jump()
を呼び出し、どのページへ進むかを制御している。
これで、プレイヤーの選択によって物語が分岐し、さらにそれぞれのエンディング(ゲームクリア / ゲームオーバー)に到達するというノベルゲームの基本構成が整いました。
メインループを更新しよう
各ページに対応する関数(page1()
〜page5()
)を用意し、プレイヤーの選択によって物語が分岐する構造が完成しました。
今回は、今どのページにいるか を判定して、それに応じたページ関数を呼び出すメインループの処理を完成させます。
まとめ
今回は、「選択肢によって展開が変わるノベルゲーム」の基本的な作り方を学びました。
この章を通して、画面の切り替えや選択肢処理の基本 を身につけることができました。この仕組みを応用すれば、もっと複雑な分岐やストーリー、セーブ・ロード機能などを追加していくことも可能になります。
自分だけのオリジナルストーリーを作って、より魅力的なノベルゲームに発展させてみてください!
ここまでお疲れさまでした。次回も楽しんで進めていきましょう!
「FAQ|ノベルゲームの分岐処理
- Q1. 選択肢で分岐させたはずなのに同じページが表示されます。
-
ボタン押下時に遷移先のページ変数が正しく更新されていない可能性があります。クリックイベント後の処理を見直してください。
- Q2. 分岐先のページを増やすにはどうしたらいい?
-
各ページを関数で分けて管理し、それぞれに条件分岐を設定すればスムーズにページ数を増やすことができます。
- Q3. ボタンを押してもページが変わらない時の対処法は?
-
blit()
で新しい画像を描画していても、pygame.display.update()
を忘れると画面に反映されません。描画の更新を忘れずに行いましょう。
質問用コンタクトフォーム
この記事を書くにあたりAIを活用しています。
人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。