めものあスマートフォン用の表示で見るめものあこの広告は、90日以上更新していないブログに表示しています。2018-12-012D横視点アクションゲームを作った話(Pygame製)これは何?これはKMCアドベントカレンダー*1の1日目の記事です。トップバッターじゃん。primeさんの"PEZY-SC2使った話でも書く"の予定です。primeさんはオセロが強い人です。adventar.orgKMC(京大マイコンクラブ)ではこれとは別にお絵描きアドベントカレンダーもやっています。KMCの名だたる絵師がこの日のために腕によりをかけて描いた逸品が拝めます。さんの尽力によって下の記事に逐一まとめられるので、良ければ参照してください。inonoaさん、頑張ってくださいね。上記Adventarがまとまっているので尽力しないようです。サボったわけではないはずです。inonoa(id:inonoa)といいます。KMC(京大マイコンクラブ)の2回生で、広報をしていたはずですが、今がちょうど次期広報への引き継ぎ期間です。次の広報には是非精力的に広報活動に励み、ひいてはKMCのみならずこの世界をも牛耳ってもらいたいと思っています。本題KMCの主要な活動の一つにゲーム制作があります。KMCにはプログラミングやDTM、お絵描きなど様々な部門*2があり、それぞれの部門の仲間と協力してクオリティの高いゲームを製作できる点でゲーム制作に最適な環境と言えます。今作は(音楽以外は)個人製作ですが...。京都大学には11月祭(学園祭)があり、KMCのブースではゲームを展示・頒布します。完全な個人制作では目標と期日を決め、黙々と開発し、それでも手に取ってもらえるかも定かでないという厳しい戦いになるかと思いますが、KMCでは11月祭を目標とし、そこでは多くの人間(しかもかなり多様)に遊んでもらうことが出来ます。gyazo.comということで作りました。その名も「敵を避ける遊戯(ゲーム)」といいます。誰も死ななくていいやさしいアクションゲームです。スクロールはしません(手抜き)。製作期間はおおむね2か月半です。ここからはこのゲームを作った上で頑張ったこととか知見とか、というか個人的に詰まったところとかを、プログラム・絵/グラフィック・ゲームデザイン*3(・音楽)に分けて書いていきます。興味ないところは適当に読み飛ばしてください。プログラム編プログラムです。こだわりの無い方はUnity*4を使ってください。私は色々あってPygameを使います。名前から察しが付く気はしますが、PygameとはPython*5のゲーム用ライブラリ*6です。Pygameですが、使えるツール(画像を読み込んで表示したり音楽を流したり)が入っているだけなので、ゲームのプログラム本体は一から作っていくことになります。最初にもろもろの準備をする処理を書いた後にメインループ*7というものを書きます。次に、その中に主人公動かしたりなんかしたりする処理を書けばとりあえず動くものが出来ます。これではタイトル画面も無ければ効果音もなっていないので味気ないですね。複数の画面(シーンとかシーケンスとかって呼びます)を作れるようにします。書くのが最適か分かっていないのですが、手探りで書いたのが下のコードになります。[gameScene]コード貼っておくとそれっぽくなりそうなので貼りました。Sceneというクラス*8を作ります。中にはいくつか書いてありますが、重要なのはlyrs(layers)だと思います(多分)。lyrsにはいろいろなものを入れることが出来るので、ここ(実際にはこれから派生したクラス(ゲーム画面ならGameScene、タイトル画面ならTitleScene、というふうに分けていく)のlyrs)にプレイヤーとか敵とか背景とかHPゲージとかもろもろを入れておけば、勝手にまとめて表示されて、すごい*9。「HPは主人公に隠れたりしてほしくない」とかがあれば、lyrsの後ろの方に入れるようにすれば、手前に表示されてすごい*10。あとはこれをいくつか作って、それらを切り替える処理を足せば、なんかゲームっぽいゲームになります。実際は敵とか主人公のクラスをつくったり*11それっぽくジャンプさせたり当たり判定をしたり音をつけたりしないとそれっぽくなりません。ちなみにUnityなどだとこの辺はそんなに書かなくてもよしなにやってくれるはずです。次のゲームはUnityで作ります。ゲームが出来たので(?)、個人的に??となったところをまとめます。効果音がなると嬉しいですよね。効果音を鳴らすまでは簡単です。具体的には、効果音の音声データを読み込む処理と再生する処理をそれぞれ一行ずつ書けば再生されます。思った私はジャンプに効果音をつけようと、ボタンを押すと音が鳴るように書き、そして実際に鳴らしました。押してから鳴るまで0コンマn秒。音が遅れて聞こえてきます。調べたところ、なんかPygameのなんかのパラメーターが初期設定ではかなりでかめに設定されているらしく、そのパラメーターをそこそこ小さめに設定しなおせば解決しました。お分かりかと思いますが細かくは何も理解していません。ちなみにこのブログを参考にしたはずです。ねごとと思ったら公式のドキュメントに普通に書いてあったので和訳のリンクを載せておきます。http://westplain.sakuraweb.com/translate/pygame/Mixer.cgi依存関係(?)ぐちゃぐちゃゲームの規模がそこそこ大きくなってくると1つのファイルではごちゃごちゃしてきて分けたくなります。分けるとバラバラになるので、このファイルからはこのファイルを使います*12、と初めに指定しないと他のファイルのクラスなどのデータが使えません。俺は単純なので、分けたすべてのファイルの始めに「他のすべてのファイルを使う」と書けば今まで通りだな、と思いました。実際には世界は単純ではありません。ファイルAがファイルBを使うと書くと、Aを実行するためにはBが必要、ということになります。Bを見るとAを使うと書かれているとしましょう。するとBを実行するためにもAが必要です。いうことでAを見に行きます。