読者です 読者をやめる 読者になる 読者になる

はんぎょねこの憂鬱

耳から変な汁が出てきた

Pythonゲームプログラミング #1 メインループ

#0 環境構築
#1 メインループ
#2 画像表示
#3 アニメーション
#4 キー入力
#5 サウンド
#6 衝突判定
#7 ステートマシン
#8 マップチップ
#9 スクロール

メインループ

pygameを使ったゲームプログラミングについて説明していきます。

  • Windows10
  • Python3.6.1
  • pygame1.9.3

今回はメインループを実装してみます。英語が苦でない方はpygame公式ドキュメントのTutorialを読んだほうが良いでしょう。

リアルタイムゲームのプログラミング

一般的なGUIアプリケーションはイベント駆動型。つまりボタン等をクリックしたときに何らかの処理がはじめて実行されるというものがほとんどです。

f:id:dungeonneko:20170510171330p:plain:w240

これに対してアクションゲームなどでは、プレイヤーが何も操作しなくてもゲーム全体の状況はどんどん変化します。

f:id:dungeonneko:20170510171342p:plain:w240

アニメーションは異なる絵をパラパラ漫画のように切り替えてものを動かしたりしますが、同じようにゲームでも、キャラクターの移動処理などを何度も繰り返しながらゲームの状況を変化させていきます。

f:id:dungeonneko:20170510171405p:plain

この1コマ1コマのことを「フレーム」と呼び、メインループとはフレームの処理を繰り返すためのループになります。

PyCharmでプロジェクトを作る

前回インストールしたPyCharmを起動します

初回起動時に出てくるウインドウの「Create New Project」ボタンを押すか

f:id:dungeonneko:20170509223327p:plain

メニューの「File -> New Project」からプロジェクトが作成できます

f:id:dungeonneko:20170509223415p:plain

とりあえず「c:\pygame」フォルダ内に「mygame」プロジェクトを作成します

f:id:dungeonneko:20170509223503p:plain

プロジェクトパネルのmygameを右クリックしてソースコードを追加します

f:id:dungeonneko:20170509223756p:plain

f:id:dungeonneko:20170509223820p:plain

これでプログラムを書く準備ができました

プログラムを書いて実行してみる

作成したmain.pyに次のプログラムを書いて実行してみます

書き終わったら「Run -> Debug…」でプログラムをデバッグ実行します

f:id:dungeonneko:20170509225543p:plain

実行するソースコードを聞かれるのでmain.pyを選択します

f:id:dungeonneko:20170509225621p:plain

青い画面のウインドウが表示されればOKです

f:id:dungeonneko:20170509230023p:plain

その他の処理について補足

pygameの細かい仕様等については公式ドキュメント見てください。

フレームレート

フレームレートとはフレーム処理が1秒間に何回実行されるのかをあらわします。

f:id:dungeonneko:20170510173940p:plain

ゲームスピードが固定されていないとキャラクターの移動速度などが変化してしまうなどの不都合がおこります。これを回避するためにフレームレートを一定に保ったり、キャラクターの移動速度や加速度をフレームレートに応じて変化させるといった処理が必要になります。

clock.tick(60)

本プログラムでは、Clockクラスを使用してフレームレートを固定しています。tick(60)は「前回の呼び出しから1/60秒経過するまで待つ」という意図になります。

イベント処理

アプリケーションは基本的にOS上で動作していて、OSからの命令(ウインドウの処理等)もアプリケーション側で正しく処理する必要があります。

f:id:dungeonneko:20170510174157p:plain:w320

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        end_game = True

アプリケーションの終了命令がきたらゲーム終了フラグをTrueにしています。このイベント処理をしないと×ボタン等に反応しなくなります。

バッファフリップ

ダブルバッファリングでは2つの画面を切り替えて処理することで、片方をウインドウに表示している間、プログラムは表示されていないほうの画面に描画処理をおこなうという処理を実現しています。

f:id:dungeonneko:20170510174252p:plain

pygame.display.flip()

ダブルバッファリングが有効になっている場合、ウインドウに表示するバッファを切り替える処理を呼び出す必要があります。
pygameではデフォルトでダブルバッファリングが有効になっているようです。