KUNISAN.JPブログ - 314 / 1692 ページ

新規書き込み
ページ:1 ... 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 ... 1692

Python + Pygameの疑似3Dゲーム (ミニゲーム第三弾)

名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2017年12月28日
Python + Pygameの疑似3Dゲーム (ミニゲーム第三弾)先日作成した疑似3Dサンプルプログラムから、何とかミニゲーム完成まで持っていくことができました。本当に作りたかったのは、スペースハリアーのようなシューティングゲームだったのですが、疑似3Dゲームについては中高生の時にも作ったことがなく、初めてということもあってもう少し簡単なものにしておこうと思いました。ということで、「障害物を避ける」のに趣旨を置いたシンプルなアクションゲームになってしまいました。

以下、動画です。


疑似3Dのゲームとなると「後ろを向いた主人公」の画像が必要になるのですが、手持ちの画像素材集には人間も動物もそのようなものがありませんでした。ネット上のフリー画像もあるのですが、「これだ」という使えそうなものはありませんでした。

その後、アマゾンで立体画像素材を自由に編集できる「アレンジOK!素材集2」というソフトを購入して、ここから主人公キャラを選択することにしました。このソフトは「人物」と「物」の色々な組み合わせが可能で、視点や服装や表情や画風まで自由に変えられます。エンディングの「建築中の家」も同じソフトの画像から切り取っています。

プログラムはこんな感じです。


ファイル一式はこちらからダウンロードできます
※本プログラムやファイルの二次配布や二次掲載はご遠慮ください。個人的なプログラム改造はご自由にどうぞ。ただし、本プログラムに関するご質問等はお受けしません。

今回、プログラム中に以下のものを取り入れてみました。
・三項演算子
・ラムダ式(オブジェクトリストの並び替え)
・スムース縮小(Pygame)
・全画面表示(Pygame)

まず、三項演算子ですが、背景の道路の縞模様を描写するところで使っています。
a = i - 8 - counter % 16 if i - counter % 16 >= 0 else 0
これは一般的な条件式で書くとこんな感じになります。
if i - counter % 16 >= 0:
a = i - 8 - counter
else:
a = 0
三項演算子はPHPやJavaScriptにもあるので馴染みはなくはないのですが、書き方が大きく異るので、少し迷ってしまいました。Pythonの場合、どちらかと言えば英語の文法通りに解釈すると、うまく飲み込める感じです。

ラムダ式はオブジェクトのリスト(character_copy)を、「z座標属性の降順で並び替え」する処理で使っています。
character_copy = sorted(character_copy, key=lambda i: i.z, reverse=True)
これもPHPやJavaScriptで同様の機能がありますが、書き方が大きく異なります。私の場合、並び替えの処理はSQLが真っ先に頭に浮かんでしまい、これを他の言語で表現するのに迷ってしまいます。
ちなみに、この部分は「奥にあるものから手前にあるものにかけて順番に画像を貼り付ける」という、疑似3Dで複数キャラクターを表示する上での「肝」になるところの前処理になります。

スムース縮小処理(Pygame)はタイトル画面のロゴのところで使っています。
image = pygame.transform.smoothscale(image, (c, d))
このメソッドは縮小画像に「複数ピクセルの色の平均化」を行うため、通常の"transform.scale"メソッドに比べて縮小した画像の見た目がより自然な感じになります。ただし、GIF画像には対応しておらず、透明処理可能なものでは24bitか32bitカラーのPNG画像でないと使えません。あと、ストッパー、蛙、鳥の小さめのキャラクターに使用すると、周辺に白いモヤモヤが発生してしまい、これはこれで少し見苦しいので、こちらはsmoothの付かない方のメソッドで処理しています(画像もGIFです)。タイトルロゴについてはもともと白の縁取りがあり、白いモヤモヤも気にならないのでsmoothの付いている方で処理しています。

全画面表示(Pygame)はある方のブログ記事を参考にしました。F11キーで全画面表示のオンとオフを切り替えられます。
screen = pygame.display.set_mode((400, 300), FULLSCREEN)
やはり全画面の方がゲームはやりやすいですね。

今回の疑似3Dゲームで、とりあえずPython + Pygameのミニゲーム作成は一段落、という感じです。次は別のモジュールを使いながら進めていくことになると思いますが、色々とできることが増えてくると嬉しいです。





Python関連記事(リンク一覧): Python + Pygameの疑似3Dゲーム (ミニゲーム第三弾) / Python + Pygameで擬似3Dサンプルプログラム / Python + Pygameのミニゲーム第二弾 『たけのこ狩り』 / Python - リスト内包表記とPygameのスプライト機能 / Pythonの学習とPygameを使ったミニアクションゲーム作成 / ...(記事連続表示)

Pythonゲームプログラミング 知っておきたい数学と物理の基本 (Future Coders(NextPublishing)) eBook
Pythonゲームプログラミング 知っておきたい数学と物理の基本 (Future Coders(NextPublishing)) eBookをAmazon.co.jpでチェック

ページ:1 ... 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 ... 1692