Pythonゲームプログラミング #1 メインループ
gist消してしまったので
代わりにこのリポジトリを参考にしてください
#0 環境構築
#1 メインループ
#2 画像表示
#3 アニメーション
#4 キー入力
#5 サウンド
#6 衝突判定
#7 ステートマシン
#8 マップチップ
#9 スクロール
メインループ
pygameを使ったゲームプログラミングについて説明していきます。
- Windows10
- Python3.6.1
- pygame1.9.3
今回はメインループを実装してみます。英語が苦でない方はpygame公式ドキュメントのTutorialを読んだほうが良いでしょう。
リアルタイムゲームのプログラミング
一般的なGUIアプリケーションはイベント駆動型。つまりボタン等をクリックしたときに何らかの処理がはじめて実行されるというものがほとんどです。
これに対してアクションゲームなどでは、プレイヤーが何も操作しなくてもゲーム全体の状況はどんどん変化します。
アニメーションは異なる絵をパラパラ漫画のように切り替えてものを動かしたりしますが、同じようにゲームでも、キャラクターの移動処理などを何度も繰り返しながらゲームの状況を変化させていきます。
この1コマ1コマのことを「フレーム」と呼び、メインループとはフレームの処理を繰り返すためのループになります。
PyCharmでプロジェクトを作る
前回インストールしたPyCharmを起動します
初回起動時に出てくるウインドウの「Create New Project」ボタンを押すか
メニューの「File -> New Project」からプロジェクトが作成できます
とりあえず「c:\pygame」フォルダ内に「mygame」プロジェクトを作成します
プロジェクトパネルのmygameを右クリックしてソースコードを追加します
これでプログラムを書く準備ができました
プログラムを書いて実行してみる
作成したmain.pyに次のプログラムを書いて実行してみます
書き終わったら「Run -> Debug...」でプログラムをデバッグ実行します
実行するソースコードを聞かれるのでmain.pyを選択します
青い画面のウインドウが表示されればOKです
その他の処理について補足
pygameの細かい仕様等については公式ドキュメント見てください。
フレームレート
フレームレートとはフレーム処理が1秒間に何回実行されるのかをあらわします。
ゲームスピードが固定されていないとキャラクターの移動速度などが変化してしまうなどの不都合がおこります。これを回避するためにフレームレートを一定に保ったり、キャラクターの移動速度や加速度をフレームレートに応じて変化させるといった処理が必要になります。
clock.tick(60)
本プログラムでは、Clockクラスを使用してフレームレートを固定しています。tick(60)は「前回の呼び出しから1/60秒経過するまで待つ」という意図になります。
イベント処理
アプリケーションは基本的にOS上で動作していて、OSからの命令(ウインドウの処理等)もアプリケーション側で正しく処理する必要があります。
for event in pygame.event.get(): if event.type == pygame.QUIT: end_game = True
アプリケーションの終了命令がきたらゲーム終了フラグをTrueにしています。このイベント処理をしないと×ボタン等に反応しなくなります。
バッファフリップ
ダブルバッファリングでは2つの画面を切り替えて処理することで、片方をウインドウに表示している間、プログラムは表示されていないほうの画面に描画処理をおこなうという処理を実現しています。
pygame.display.flip()
ダブルバッファリングが有効になっている場合、ウインドウに表示するバッファを切り替える処理を呼び出す必要があります。
※pygameではデフォルトでダブルバッファリングが有効になっているようです。