今回は気が向いたので、約一ヶ月前の工大祭に向けて作ったゲームの話を主に自分のために書いておこうと思います。(もう今更感あるのでこっそり書いておきますφ(..))
今回、一週間でゲームを作って工大祭で展示(実際には二日目午後のみ)していたのですが、そのゲーム制作についてどんな感じだったかを少しまとめておこうと思います。
今回は下のような感じのゲームを作っていました。
図1. 今年のゲームのゲーム画面
---------- はじまり ----------
夏休みを競プロやTerrariaなどで溶かし、10月に入ったあたりの頃、あと一週間程度で工大祭があることに気が付きました。 工大祭に何か出したいなと思っていたので、今年もゲームを作ろうと思いました。 去年もほぼ一週間でゲームを作っていたので、今年もできそうな気がしたので作ることにしました。
---------- 制作言語について ----------
工大祭は毎年なんとなく違う言語で作っているので(HSP, C++&DirectX, javascriptという感じ)、今年も違う言語で作ろうと思いました。
そこでいろいろ考えて、今年はPythonを使うことにしました。Pythonは競プロ以外にはほとんどまともに使ったことがないので、使ういい機会だと思いました。
そして、流石に一から作っていくのもアレだったので、ライブラリとしてPygameを使うことにしました。
---------- アイデア ----------
毎年ゲームを展示してきた経験から、工大祭向けのゲームとして、
- 短時間で遊べるシンプルなゲーム
- 子供に受けそうなゲーム (ゲームを遊ぶのはほとんど子供なので)
を作ろうと考えていました。
夏休みにTerrariaをしていた影響もあり、作るゲームのアイデアとしては「駆け抜けながら敵を倒していくゲーム」という感じで考えていました(Terrariaで走り回るの楽しい✌ ('ω' ✌ )三 ✌ ('ω') ✌ 三( ✌ 'ω') ✌)。それ以上は実際に作りながら考え、制作期間の都合上、最終的には「走りながらスライムを倒しまくってレベルを上げながらスコアを稼いで行くゲーム」になりました。実際にはもうちょっといろんな敵を出したかったのですが、時間や画力がなさすぎて諦めました。
---------- 制作流れ ----------
ゲーム制作の流れとして、大雑把に
- ゲームの基盤を作る
- ゲーム画面を作る
- その他の画面(ランキング画面など)を作る
- 効果音などをつける
みたいな流れで作っていました。
---------- ゲームの基盤 ----------
ゲームの基盤はシーン管理システムです。この実装はゲームを作るときにやりやすいので毎回やっています。
シーン管理とは、各場面(ゲーム画面やタイトル画面など)を分割したものを管理することです。
各シーンクラスに初期化(init)関数や描画(render)関数、更新(update)関数などを実装します。そしてシーンを管理するクラスでその関数を呼び出すようにしておくようにします。この実装により簡単にシーンの追加や切り替えなどを行うことができます。(デザインパターンのTemplate MethodパターンとStateパターンが使われています)
図2. シーン管理システムのイメージ
また、シーンの管理方法はスタックで行うようにしておきます。スタックで持つことにより、いろいろな処理がしやすくなります。例えば、複数のシーンを順番に処理するということも可能になります。
例えば、ゲーム画面でポーズをかける実装を行うとします。このとき、後ろでゲーム画面を描画しながら前にポーズ画面を描画する方法としてフラグを使う方法が考えられますが、処理の分岐などで実装が複雑になる可能性があります。そこで、ゲーム用のシーンとポーズ用のシーンに分け、ゲームシーンの画面を描画しながらポーズシーンの画面を処理するようにします。この実装を行うことで分岐の実装がなくなってシンプルな実装になり、さらにそれぞれの実装を分けて記述できるので、分かりやすい実装にもなります。
今回この処理をタイトル画面とランキング画面で用いており、後ろでゲーム画面を処理しながら前面でメニュー画面を処理しています。
図3. 今回のシーンスタック管理のイメージ
ゲームのシーン管理については、ググればいろんな情報が出てくるのでよく知りたいと思った方は調べてみてください。
---------- Pygame ----------
Pygameはゲーム用のライブラリです。
Pygameではウィンドウ表示をはじめ、入力処理、画像描画、音楽再生機能などの機能が簡単に使うことができました。今回、このライブラリを使ったことで入出力機能関係の処理で詰まることなくゲームを作ることができました。
---------- 作ってて困った点 ----------
・画像の回転後のサイズがおかしい・・・?
pygame.transform.rotateを使うことで画像の回転ができるのですが、仕様で回転させた後の画像のサイズが元の画像以上のサイズになるっぽいです。そのため、回転後の画像の中心が必ずしも元の画像の中心になるとは限らないということになります。今回はオブジェクトを全て中心座標で管理していたので、画像を回転させたときの中心座標を自力で計算する必要があり、少し手間がかかりました。
・py2exeが通らない!
展示用にexeに変換するためにはじめはpy2exeライブラリを使おうと思ったのですが、
NotImplementedError: font module not available
というエラーが出て通りませんでした。どうやら使ったフォントがうまくパックできないようでした。(一日目に展示できなかったのだいたいこいつのせい)
その後、pygame2exeというものがあることに気づいて、こっちを使うことでうまくexeに変換できました。
・SEの遅延・・・?
音無しだとアレだと思ったので工大祭の日に速攻で効果音をつけたのですが、普通に分かるくらいに遅延してました。もしかしたら私の使い方がよくなかっただけかもしれませんが。
---------- 感想 ----------
Pythonは競プロの影響で遅いかもなーって思っていたのですが、普通にさくさく動いていて、Pythonもゲーム用に十分に使えるなと思いました。
今回のゲームについて思ったのが、面白くなる要素が足りないなということでした。もう少し時間があれば、コインなど、敵以外でポイントを稼げる要素を足せて、もうちょっと面白くできたんじゃないかなと思いました。(なら、もうちょっと早くから作れという(-_-;))
来年はもうちょっとしっかりしたゲームを作ろうと思います・・・。(て、去年も思った気がするんだが・・・。)
今回のゲームですが、上で書いた通りいろいろ足りてないので、暇な時に改良して公開するかもしれません。
ではでは(ヽ´ω`)