ながみえ
psgameを用いたゲームアプリを制作するサイトの、ゲームループについて紹介するページのアイキャッチ画像

一つ前のページではpygameの導入方法について学習しました。

今回は ゲームループの基本 について見ていきましょう。

Chapter1:pygame入門|画面を表示しよう
・Chapter1-1:pygameを導入しよう
・Chapter1-2:ゲームループの基本を理解しよう ◁今回はここ
・Chapter1-3:画面に画像を表示しよう
・Chapter1-4:画面に文字を表示しよう
・Chapter1-5:画面上の画像を動かそう
Chapter2:簡単なノベルゲームを作ろう
Chapter3:簡単なアクションゲームを作ろう
Chapter4:ブロック崩しを作ろう
Chapter5:シューティングゲームを作ろう
Extra1:横スクロールのアクションゲームを作ろう

ゲーム開発において、「ゲームループ」はゲームの動作を支える重要な仕組みの一つです。

ゲームではキャラクターを動かしたり、敵の出現を管理したり、スコアを更新したりといったさまざまな処理を常に繰り返し行う必要があります。これらの処理をまとめて制御するのが「ゲームループ」です。

例えばテレビゲームをプレイするとき、プレイヤーがボタンを押すとキャラクターが移動し、それに応じて背景や敵も変化します。

このような「画面を更新し続ける仕組み」がなければ、ゲームは静止画のままで動くことはありません。つまりゲームループがなければ、ゲームは成立しないのです。

この章ではまずゲームループの仕組みを学び、実際にコードを動かしてその動作を理解していきます。

プログラムを作成しながら、ゲーム開発の第一歩を踏み出してみましょう!

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

<<前のページ

pygameの記事一覧

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

次のページ>>

ゲームループとは?その仕組みと重要性

ゲームループとは、ゲームが動作している間、常に繰り返される一連の処理 のことを指します。

ゲームがリアルタイムで動作し続けるためには、以下のような処理を繰り返し行う必要があります。

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

ゲームの流れと基本構成を理解しよう

ゲームの基本的な動作は、以下のような流れになっています。

  1. 初期化(ゲームの準備をする)
  2. メインループ(以下の5つの動作を繰り返す)
    • 入力処理(ユーザーの操作を受け取る)
    • ゲームの更新(キャラクターの動き、当たり判定、スコア更新など)
    • 描画処理(画面の更新)
    • 画面の表示(変更を画面に反映)
    • 終了判定(ゲームを終了するかどうかを判定)

この流れを 1秒間に何十回も繰り返す ことで、ゲームはリアルタイムに動作します。

ゲームループが必要な理由と役割

ゲームは普通のプログラムとは異なり、「常に動き続ける」 ことが求められます。

たとえば普通のPythonプログラムでは、処理が終わればプログラムも終了します。しかしゲームではユーザーが操作している間、ずっと動き続けなければなりません。

もしゲームループがなかったら、キャラクターが一度だけ動いて止まったり、ボタンを押しても画面が変化しなかったりと、ゲームとして成り立たなくなってしまいます。

ゲームループを使ってリアルタイムで処理を繰り返すことが重要 なのです。

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

実際にゲームループを作ってみよう

ゲームループの仕組みを理解するために、簡単なPygameプログラムを実装して実際に動作を確認してみましょう。

このプログラムでは、「白い背景に赤い円を表示する」だけのシンプルなゲームループを作成します。

注意点

ここから、pygame独自の関数がたくさん出てきます。

覚えるのは大変ですが、この記事で紹介する関数はゲーム作成において必須の物ばかりです。頑張って覚えましょう。

ただし、それらの関数は今後のchapterでも頻繁に出てくるため、今回だけで覚えきる必要はありません。

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

ゲームループを実装するコード

以下のコードをエディタに書き込んで実行してください。

コピーして貼り付けることもできますが、このコードはゲームループの基礎中の基礎であるため、覚えるためにもぜひ手打ちすることを推奨します。

import pygame, sys # pygameとsysモジュールをインポート
pygame.init()	   # pygameを初期化
screen = pygame.display.set_mode((800,600)) # 画面のサイズを設定(幅800px、高さ600px)

# 無限ループでゲームを動作させる
while True:
    # 画面を白色で塗りつぶす(毎フレームの更新)
    screen.fill(pygame.Color("WHITE"))
    # 赤い円を描画(座標(100,100)から幅100、高さ100の楕円)
    pygame.draw.ellipse(screen, pygame.Color("RED"), (100, 100, 100, 100))
    # 画面の更新(描画した内容を反映)
    pygame.display.update()
    # イベント処理(ウィンドウの閉じるボタンが押されたら終了)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # 閉じるボタンが押されたか確認
            pygame.quit()  # pygameを終了
            sys.exit()  # プログラムを終了

このコードを実行すると、以下のような動作をします。

  • ウィンドウが開き、白い背景に赤い円が表示される。
  • ×ボタン(ウィンドウの閉じるボタン)を押すと、プログラムが終了する。

While文の中身である「白い背景と赤い円を表示して、閉じるボタンが押されたか確認して、押されていたらプログラムを終了する」という作業を無限ループしています。

今後、学習を進めていくと「移動ボタンが押されていたらキャラクターの座標を変更する」や「自機と敵の衝突判定がTrueだったらゲームオーバー画面を表示する」などの処理を追加できるようになります。

まずは、このシンプルなゲームループコードの詳細を見ていきましょう。

ゲームループの各処理を詳しく解説

先ほどの ウィンドウに赤い円を表示するコード を詳しく分解し、各部分の役割を細かく解説していきます。

最初なので初めて見る内容ばかりになるでしょうが、ここでしっかりと記憶しておけば後々楽になりますので、頑張りましょう!

(1) Pygameの初期化

import pygame, sys  # pygameライブラリとsysライブラリをインポート
pygame.init()  # pygameライブラリのinit関数を呼び出して、Pygameを初期化
  • import pygame はゲーム開発用のライブラリを使用するためのインポート文。これを使ってウィンドウを作成し、図形を描画できる。
  • sys はプログラムの終了処理に使用する標準ライブラリ。コンマ「,」で区切ってpygameと一緒にインポートしている。
  • pygame.init()はPygameのすべての機能を使えるようにするための初期化処理。この1行がないとPygameの機能を使えない。

Python学習のLesson1-6でRandomモジュールをインポートして乱数生成しましたが、それと同じことをしています。

あわせて読みたい
【レッスン1-6】ランダムな数値を作ろう!乱数生成の基本|Python入門
【レッスン1-6】ランダムな数値を作ろう!乱数生成の基本|Python入門
Q
コラム:ライブラリやモジュールって何?

プログラミングを学んでいると「ライブラリ」や「モジュール」という言葉をよく目にします。

特に Pygame では、pygame.displaypygame.event のように、ライブラリとモジュールを組み合わせて使います。

ライブラリとは?

ライブラリ(Library) とは、特定の機能を提供する 「便利な機能の集まり」 のことです。

Pythonには、標準ライブラリ(最初から使えるもの)と、外部ライブラリ(追加でインストールするもの)があります。

コードの冒頭でインポートすることにより、そのライブラリ内に定義された特殊な関数を呼び出せるようになります。

  • 標準ライブラリの例:random(乱数)、sys(システム操作)、math(数学計算)
  • 外部ライブラリの例:pygame(ゲーム開発)、pandas(データ分析)

モジュールとは?

モジュール(Module) とは、Pythonのコードが書かれた 「1つのファイル(.pyファイル)」 のことです。

Pythonでは、ライブラリの中に複数のモジュールが含まれていることが多いです。例えば、Pygameの displayevent も「モジュール」です。

ライブラリ同様、インポートすることで特殊な関数が使用できるようになります。

(2) 画面の作成

screen = pygame.display.set_mode((800,600))  # 幅800px、高さ600pxのウィンドウを作成
# pygameライブラリのdisplayモジュールのset_mode関数を呼び出して、変数screenに代入
  • 幅 800px、高さ 600px のウィンドウを作成する。
  • (800, 600) の部分を変更すれば、好きなサイズのウィンドウを作ることができる。

ここまでが、最初に紹介したゲームループの基本的な流れの中の「① 初期化(ゲームの準備をする)」に該当します。

(3) ゲームループ

while True:
  • 無限ループ を使い、ゲームが動作し続けるようにする。
  • ゲームが終了しない限り、このループがずっと実行される。

ここから、ゲームループの基本的な流れの中の「② メインループ(以下の5つの動作を繰り返す)」に入ります。

あわせて読みたい
【レッスン2-6】while文でループを柔軟に制御する方法|Python入門
【レッスン2-6】while文でループを柔軟に制御する方法|Python入門

(4) 画面の背景を更新

screen.fill(pygame.Color("WHITE"))  # 画面を白色で塗りつぶす
# 変数screenを、fill(色)関数を用いて塗りつぶす
# pygameライブラリのcolorクラスを使用する
  • 画面全体を白色 (WHITE) にする。
  • メインループの中の最初に実施することで、前のフレームの描画が残ってしまうことを防ぐ。

(5) 図形の描画

pygame.draw.ellipse(screen, pygame.Color("RED"), (100, 100, 100, 100))  
# pygameライブラリのdrawモジュールのellipse関数(円を描写する関数)を呼び出す
  • (100,100) の位置に、幅100px、高さ100pxの赤い円(楕円)を描画 する。
  • 座標を変えると、円の位置を変更できる。

図形の描写に関しては、次のチャプターでもう少し詳細に学習します。

(6) 画面の更新

pygame.display.update()
# pygameライブラリのdisplayモジュールのupdate関数を呼び出し
  • 最新の描画内容を画面に表示する処理。
  • これを実行しないと、画面に何も表示されない。

(7) イベント処理

for event in pygame.event.get():
    if event.type == pygame.QUIT:  
        pygame.quit() # pygameライブラリのquit関数を呼出し
        sys.exit()    # sysライブラリのexit関数を呼び出し
  • pygame.event.get():発生したイベント(ユーザーの操作)を取得 する。
  • event.type == pygame.QUIT:ウィンドウの閉じるボタン(×ボタン)が押されたらゲームを終了する処理。
  • pygame.quit():Pygameを終了する処理。
  • sys.exit():プログラムを完全に終了する処理。
【Python】勉強猫がコーヒーを片手にリラックスしている様子。記事内の休憩用イラスト

よく使う関数とその使い方まとめ

ここでは、ゲームループのコード内で使用した関数を一覧にまとめました。
これらの関数を理解すると、ゲームの仕組みがより明確になります。

(表の中にない関数は次回以降のChapterで詳細の解説があります)

ライブラリモジュール関数内容
pygameinit()Pygameの機能を利用するための初期化を行う
displayset_mode()指定したサイズのウィンドウを作成する
update()最新の描画内容を画面に反映する
Color(“色”)指定した色のRGBデータを取得する
(正確には関数ではなくコンストラクタ)
eventget()ユーザーの入力やウィンドウ操作などのイベントを取得
quit()Pygameのすべてのモジュールを終了する
sysexit()Pythonのスクリプトを強制終了する

ゲームプログラムを作成するとき、Pygameの基本的な関数を 自然に使えるようになる ことがとても重要です。

上記の関数は特に、ゲームループ内で頻繁に出てきますので、使いながら覚えていきましょう。

4. まとめ

このチャプターでは、ゲーム開発の基本となる 「ゲームループ」 について学びました。

ゲームループは、リアルタイムに画面を更新し、ユーザーの操作を受け付けるために必要不可欠な仕組み です。

ここまで学習を進めてきたことで、皆さんは ゲーム開発の第一歩 を踏み出しました!
最初は単純な図形の描画でしたが、これが キャラクターや敵を動かす基盤 になります。

ぜひ次の学習に進んでみてください!
お疲れさまでした!

もっと分かりやすい学習サイトにするために

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

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

<<前のページ

pygameの記事一覧

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

次のページ>>

FAQ|ゲームループの基本に関するよくある質問

今回の記事に関する「よくある質問」とその解答について、以下の内容を参考にしてください。

Q
Q1. ゲームループを使う理由は何ですか?

ゲームループは、ゲーム画面の更新やプレイヤーの操作処理など、ゲームを動かし続けるための繰り返し処理を担当します。

毎フレームで描画やイベント処理が必要なため、ゲーム開発では必須の仕組みです。

Q
Q2. ゲームループ内で処理を分けて書くにはどうすればいいですか?

ゲームループでは、入力処理・ゲーム状態の更新・画面描画などをそれぞれ関数やブロックに分けて記述するのが一般的です。

これにより、コードが整理されて読みやすくなり、保守性も向上します。

Q
Q3. ゲームループの「フレームレート」を調整するにはどうしたら良いですか?

フレームレートの調整には、pygame.time.Clock()クラスを使い、ループの最後でclock.tick(フレーム数)を呼び出します。

これにより、指定したフレームレートでゲームが動作します。

ゲームループの基本についてよくあるトラブルと解決法

今回の記事に関する「よくあるトラブル」とその原因、解決法について、以下の内容を参考にしてください。

ゲーム画面がすぐに閉じてしまう

Q
トラブルの原因と対処法を見る

トラブルの原因

イベント処理が正しく書かれていない、または「pygame.QUIT」イベントを正しく検知できていない場合によく発生します。

トラブルの解決法

イベントループ内でfor event in pygame.event.get():と書き、if event.type == pygame.QUIT:の部分が正しく記述されているか確認してください。

特に、インデントやスペルミスがないかも注意して見直しましょう。

ウィンドウが反応しなくなる(強制終了しないと閉じられない)

Q
トラブルの原因と対処法を見る

トラブルの原因

ゲームループ内でpygame.event.get()を呼んでいない場合や、ループが止まらなくなる無限ループが原因の場合があります。

トラブルの解決法

ループ内でイベント処理(pygame.event.get()の記述)が抜けていないか確認してください。

また、終了条件となるフラグやbreak文が正しく働いているかもコード全体をチェックしましょう。

記事URLをコピーしました