KUNISAN.JPブログコメント書き込み![]() ※書き込み欄はページ下にあります。 Python - リスト内包表記とPygameのスプライト機能名前: 小川 邦久 リンク: http://kunisan.jp/ 日付: 2017年12月2日 ![]() ![]() 以下、ソースコードです。 ------------------------- ファイル一式はこちらからダウンロードできます。 ※本プログラムやファイルの二次配布や二次掲載はご遠慮ください。個人的なプログラム改造はご自由にどうぞ。ただし、本プログラムに関するご質問等はお受けしません。 まずはリスト内包表記(List Comprehension)です。 今から30年近く前(高校2年でした)、X68000であるゲームを作っている時に、円運動するキャラクターを設置しようと思いつきました。シンプルに三角関数(サイン/sin、コサイン/cos)で座標を決めればいいと思っていたのですが、当時のパソコンは今のものに比べて処理速度が貧弱ということもあり、キャラクターを複数設置すると三角関数の繰り返しの計算の影響で、動作に遅延が起きるようになってしまいました。そこで考えついたのが、「三角関数の計算で得られた数値を予め配列変数に格納しておき、キャラクターの座標はその配列変数から順番に取り出していく」という方式です。これにより繰り返しの処理が変数から数値を取り出すだけになったことから、動作の遅延は解消されました。 Pythonでは配列変数とは言わず、「リスト」と呼びますが、今回のソースコードでは、以下の部分が三角関数(コサイン)の計算とリストへの格納になります。 circle_x = [math.cos(math.pi/180*i) for i in range(360)] 他の言語に慣れている人なら、恐らくこんな感じの方が馴染み深いと思います。 for i in range(360): これが一行でまとまる上に見た目も分かりやすいので、 これからも内包表記を多用していこうと思います。 ちなみに、比較的「低速」と言われるPythonですが、当時のX68000のX-BASIC+Cコンパイラーで作成したプログラムよりも断然早く、この程度の円運動なら繰り返し三角関数を計算させる方法でも全く問題ありませんでした(10倍速でも問題無いです)。しかし、今後大きなプログラムを作る時など、端末側に負担をかけない意味で、このやり方は慣れておいた方が良いかなと思っています。 次にスプライト(Sprite)機能です。 また昔話になりますが、上述のX68000のX-BASICや、その数年前のファミコンのプログラミングソフト「ファミリーBASIC」でもスプライト機能に対応していました。スプライト機能を使うとキャラクターを動かしつつ特別な処理をしなくても、背景画像が崩れることはありません。逆にスプライト機能が無いパソコンでは、キャラクターが動作した後に残像が残ってしまうため、その部分のみを都度描き直したり、もしくは画面全体を毎回リフレッシュして描画するなどの手法が必要でした。 ちなみに、昨年作成したHTML5+JavaScriptのミニゲームでは、div要素をブロックにして座標を設定する形で、ほぼスプライト機能と同じことができました。 Pygameのスプライトについても、同じような機能を期待していたのですが、残念ながら何らかの処理をしない限り、キャラクターを動かした後に残像が残ってしまいます。そのため、今回作成したサンプルプログラムでは、動作毎に画面をリフレッシュする方式を取っています。 ただ、Pygameのスプライトは衝突(collision)判定が充実していて、グループ化の機能と合わせて使用すれば効率よくプログラムが書けるかも知れません。今回のサンプルプログラムにはその辺りの関数は含めていませんが、また近いうちにスプライト+衝突判定を利用したミニゲームを作ってみようと思います。 Python関連記事(リンク一覧): Python + Pygameの疑似3Dゲーム (ミニゲーム第三弾) / Python + Pygameで擬似3Dサンプルプログラム / Python + Pygameのミニゲーム第二弾 『たけのこ狩り』 / Python - リスト内包表記とPygameのスプライト機能 / Pythonの学習とPygameを使ったミニアクションゲーム作成 / ...(記事連続表示)
![]() ※HTMLタグ入力は出来ませんのでご了承ください。
![]() |