[HMC]年間5250円で独自ドメイン付属、ウィルスチェックありのレンタルサーバ!
Last update : 2000/10/02
演出&エフェクト 第7回
画像を粉々にする
サンプルコードのダウンロード
  では、まずサンプルコードをダウンロードし、解凍して下さい。 私はVisual C++6.0でコンパイルしているので、をお持ちの方は Visual C++でプロジェクトファイルを開いて下さい(「effec_07.dsw」をダブルクリックすれば開けます)。 圧縮ファイルに含まれる「effec_07.exe」をダブルクリックし、実行してみて下さい(何かキーを押すと終了します)。 どうでしょう?画面が切り替わり、Takabo Soft Networkのロゴが左から徐々に粉々になり落ちていくと思います。
  というわけで、今回は徐々に画像を粉々にする方法を紹介します。
早速サンプルコードの解説
というわけで、今回は順番に説明していきまーす。

今回は、なんとなく構造体を使っています。
  サンプルプログラムを実行すれば解ると思いますが、画像は左から段々と1ドットずつに分解され、それぞれが 独立して動いています。ですから、1ドットにつき、1データ(上の構造体の場合たぶん28バイト)が必要となります。 今回使用している画像サイズは612×145ですから、計612x145x28=2484720バイト必要となります。 このサイズを配列として「struct _dust dust[145][612]」などとすると、VCの場合、実行時にエラー(スタックオーバーとかその辺)が出てしまい、正常に 動作しません。ですから、「動的に確保」するようにします。
  んでもって、プログラム中に「_dust」構造体を動的に確保すると仮定した場合、 プログラムを終了する前にデータを解放しなければなりません。「GlobalFree」については 後でちょっと触れます(^^;
ここでメモリを動的に確保しています。
動的に確保する方法は「malloc」だとか「new」だとか色々ありますが、今回はなんとなく 「GlobalAlloc」を使用します。これはAPIだったかな?まぁ、この関数についての詳細は VCのMSDN(?)を参照して下さい。とにかく「GlobalAlloc(GMEM_FIXED,データサイズ);」 としてやれば、データサイズ分のメモリを確保し、確保したメモリの先頭アドレスを返してくれます。 この関数で確保したメモリを解放するのが「GlobalFree(メモリの先頭アドレス);」です(Quit()関数内で使用)。
この辺から、先程確保した構造体を初期化します。
まずここで、画像を読み込んである作業用サーフェイスをロックしておきます。
ロックについては「
DirectDraw基礎 第12回」でやりました。
  上の方でも触れたように、画像の1ドット1ドット全てに対して1つのデータを作成します。 ただ、画像の黒い部分「色番号0」は表示しないので、データは作成しません。あとは大体解りますかね?ランダム値によって速度と 角度を決め、そこから三角関数を使用してX、Yの増加値を決定します。
ちなみに「指定した角度の方向に進む」ような処理は「ゲーム制作基礎 第4回」でやりました。
  データを作成してしまえば、あとは毎回各データのx,y座標にx,y増加量を足していき、画面に表示するだけです。 簡単ですね。ただ、今回はビデオメモリ(lpBack)を直接操作しているので、ビデオカードによっては「やたら遅い!」 という事もあると思います。そういった場合は、作業用バッファ(その2)としてオフスクリーンサーフェイスをシステムメモリ内に作成し、 そこを直接操作してデータを書き込み、バックバッファへBltFastで転送、Flip・・・とすれば、多少は速くなると思いますのでやってみて下さい。