へたっぴpythonista

ド素人pythonistaとして、日々の学習成果や気づいたことについて書きます。

メインループの概要と注意点

久々にpygame

 

今回はメインループの作り方と、ウィンドウを閉じさせる方法について。

メインループ

f:id:ruriohead:20130709093126p:plain

 

前回のループではwhile True:を利用してループを作りましたが、上のようにFalseを基準としてループを制御することもできます。

 

本文にはまず、EVENT1として、ユーザーの行動に対して反応するためのforループを書きました。ユーザーの行動をリストに反映させ、それに応じたイベントを起こすという仕組みです。

今のところ、中味はループを終了させるためにdoneの値を変化させるものだけです。

 

その次のsurface.fill(color)はそのまま、画面(surface)を色(color)で満たす(fill)ためのコマンドです。surfaceには自分で作成した画面を、colorにはあらかじめ自分で定義した色があればその引数を、なければRGB法で([50,50,50,])の様に指定します。

追記:surface.fill(color)は必ず描画の前に行うようにしてください。図形等を描いたのちにfillを行うと図形等は見えなくなります。

例えば○ surface.fill() → pygame.draw.circle 画面を塗りつぶした後に円を描く

    × pygame.draw.circle →surface.fill()    描いた円もろとも画面を塗りつぶす

 

さらにその次は図形の描画です、簡単な図形ならpygameに備わった描画メソッドで作れます。特に説明することはないかな。

 

すべて書き終えたら、最後にpygame.display.flip()かpygame.display.update()で画面を更新し、変更を反映します。

 

 

おまけとして、描写速度の調整もしておきます。静止画を描写し続ける場合は書かなくても分かりませんが、アニメーションの作成時には大変重要な項目です。一秒間の描写回数を指定することで、アニメーションの速度を変化させます。これを指定しないと、常に最高速で処理を行うことになり、アニメーションは目に見えない速さで変化してしまいますのでご注意。

描写速度の指定にはpygame.time.Clock()を使います。clock=pygame.time.Clock()等と指定しておくと分かりやすいと思います。後はループ内でclock.tick(描写回数)と記述すれば完了です。

 

これを動作させれば、

f:id:ruriohead:20130709094404p:plain

 

さて、このディスプレイには重大なミスがあります。

 

 

このディスプレイ、閉じられません!!

 

試しに右上の×ボタンをクリックしてみると・・・一向にディスプレイが閉じる気配がありません。

ゲームを作ってるときは、ソースコードを閉じてしまえば一緒に閉じるのでまだいいですが、実際にプレイする時になってAlt+F4でないと閉じられないゲームになっていいわけがないので直しましょう。

 

やることはただ一つ。ループを抜けた後にウィンドウを閉じるためのコードを書くだけです。

上のコードでは×ボタンでループから抜けるコードは書きましたが、抜けた後のコードが書けていたために、「ループは抜けたけど、そのあとは何するの?」という状態になっていたのです。

f:id:ruriohead:20130709095328p:plain

このように最終行にpygame.quit()と記述するだけで、ウィンドウを閉じられるようになります。