Pygame

入門用サイト

Tips

numpy:大きな配列や行列計算ができるパッケージを入れよう

pygameではピクセル単位の操作にnumpyやNumericといった大規模行列計算用のパッケージを使っています.数百×数百のピクセルを自前のforループで書くと非常に遅くなってしまいますが,これらのパッケージを利用することで高速な処理を実現することができます.以下のTipsでも透明度の操作や連立方程式の解を得るなどの目的で使用しています.

ダウンロードはこちら:SciPy - Download

SciPyというのは科学的なさまざまな問題(統計,積分,イメージ処理,最適化など)を解くためのツールですが,ここでは気にせずDownloadページに行ってnumpyをダウンロードしましょう.

Binary installation for Windows (32-bit) Install NumPy 1.1.1 for Python 2.5 or NumPy 1.1.1 for Python 2.4 or NumPy 1.1.1 for Python 2.3

↑のようにPythonの各バージョンに合わせたものがありますので,お使いのPythonのバージョンに合ったものをクリックしてください.

一応行列計算のサンプルなど.numpyのarrayはPythonのlistとほとんど同じで,相互の変換が簡単にできます.arrayに対する操作もたいていlistにもarrayにも適用できるようにただの関数になっています.(arrayのオブジェクトと結合していない)

ピクセルごとのα値を持つサーフェスの半透明化

画像を半透明にして描画する際にset_alphaを使うことが多いですが,画像がピクセルごとにα値を持っている場合*1はset_alphaは効果がありません.ピクセルごとにα値を持っているサーフェスを徐々に透明にしていきたい場合はこの値を直接操作する必要があります. 大きな画像をリアルタイムにフェードするような場合はたぶん重いです.

transparency.gif

画像の中心を軸にした回転

画像を回転させるとサイズが変わってしまうので,回転前と同じ座標に描画するとバウンドしているような微妙な動きになってしまいます(下画像右側).以下のrotate_blit関数はもともとの画像の中心を軸に回転するように描画します.centerフラグをFalseにしたときが左側,Trueにしたときが真ん中で赤い点は描画位置に指定した座標を表しています.Falseのときは回転角度が0のときの左上座標を基準にしているので通常のblitと親和性が高いです.
pygameでは「回転させて描画」を一度にやることはできず,「回転させたサーフェスを作成」「描画」という手続きが必要なので,大きな画像の回転はかなり重くなってしまいます.

rotate.gif

画像の任意の点を軸にした回転

上記の方法は常に中心を軸にして回転を行いますが,こちらは任意の点を軸にして回転する方法です.中心を軸にしたときよりも少し計算は多いですが描画や回転サーフェスの作成に比べれば計算コストは圧倒的に小さいです.
※微妙にカクカクしてるので誤差分の修正が必要…

rotate2.gif

なめらかな曲線が欲しい(Spline-Curve:スプライン曲線)

ゲームで使うことはあまり無いかもしれませんが,例えばシューティングゲームで敵や弾のなめらかな軌道を実現したいときにこういった補間曲線を使うと良いかも知れません.以下のmake_spline_funcは参考サイトに載っている計算をそのまま実装したものですが,連立方程式の解を求める部分はnumpyのsolve関数を使っているのでそんなに遅くはないと思います.

* 参考

* サンプル画像
黄色がスプライン曲線,紫がCatmull-Romスプライン曲線です.

spline_curve.png

なめらかな曲線が欲しい(Catmull-Romスプライン曲線)

上記のスプライン曲線は連立方程式の解を求めるなど手続きが煩雑ですが,こちらはかなり手軽に補間曲線の関数を得ることができます.ここではイテレータブルなオブジェクトとしてCatmullクラスを定義してみました.35〜37行目の例にあるとおり,サンプル点を与えてCatmullオブジェクトを作り,for文で回すだけで簡単に補間曲線を形成する点を取得することができます.

* 参考


*1 またはconvert_alphaした場合

添付ファイル: filespline_curve.png 739件 [詳細] filerotate2.gif 710件 [詳細] filetransparency.gif 685件 [詳細] filerotate.gif 2242件 [詳細]
Last-modified: 2008-09-08 (月) 01:17:54 (5681d)
トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS このエントリーを含むはてなブックマーク ref