というわけで、今回は順番に説明していきまーす。
今回は、なんとなく構造体を使っています。
サンプルプログラムを実行すれば解ると思いますが、画像は左から段々と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・・・とすれば、多少は速くなると思いますのでやってみて下さい。