SOFTドット絵エディタ「EDGE2」、MIDI音楽編集ソフト「Domino」、楽曲などを配布している個人サイトです。演出・エフェクト編サンプルコードのダウンロードでは、まずサンプルコードをダウンロードし、解凍してください。C++でプロジェクトファイルを開いてください(「effec_07.dsw」をダブルクリックすれば開けます)。圧縮ファイルに含まれる「effec_07.exe」をダブルクリックし、実行してみてください(何かキーを押すと終了します)。Networkのロゴが左から徐々に粉々になり落ちていくと思います。いうわけで、今回は徐々に画像を粉々にする方法を紹介します。サンプルコードの解説というわけで、今回は順番に説明していきまーす。今回は、なんとなく構造体を使っています。left;//動作までの残りカウント}*dust=NULL;サンプルプログラムを実行すれば解ると思いますが、画像は左から段々と1ドットずつに分解され、それぞれが独立して動いています。1ドットにつき、1データ(上の構造体の場合たぶん28バイト)が必要となります。今回使用している画像サイズは612×145ですから、計612x145x28=2484720バイト必要となります。dust[145][612]」などとすると、VCの場合、実行時にエラー(スタックオーバーとかその辺)が出てしまい、正常に動作しません。「動的に確保」するようにします。*str=NULL){EndDirectDraw();if(str!=NULL)MessageBox(hw,str,"Message",MB_OK);if(dust)GlobalFree(dust);dust=NULL;exit(1);}んでもって、プログラム中に「_dust」構造体を動的に確保すると仮定した場合、プログラムを終了する前にデータを解放しなければなりません。_dust)*145*612);if(dust==NULL)Quit("メモリを確保出来ませんでした");ここでメモリを動的に確保しています。動的に確保する方法は「malloc」だとか「new」だとか色々ありますが、今回はなんとなく「GlobalAlloc」を使用します。これはAPIだったかな?まぁ、この関数についての詳細はヘルプを参照してください。「GlobalAlloc(GMEM_FIXED,データサイズ);」としてやれば、データサイズ分のメモリを確保し、確保したメモリの先頭アドレスを返してくれます。この関数で確保したメモリを解放するのが「GlobalFree(メモリの先頭アドレス);」です(Quit()関数内で使用)。*)desc.lpSurface;この辺から、先程確保した構造体を初期化します。ここで、画像を読み込んである作業用サーフェイスをロックしておきます。第12回」でやりました。(float)cos(angle*3.141592/180)*speed;dust[dust_max].y_add=-(float)sin(angle*3.141592/180)*speed;dust[dust_max].color=col;dust[dust_max].left=x/6+rand()%10;dust_max++;}}}上の方でも触れたように、画像の1ドット1ドット全てに対して1つのデータを作成します。画像の黒い部分「色番号0」は表示しないので、データは作成しません。あとはランダム値によって速度と角度を決め、そこから三角関数を使用してX、Yの増加値を決定します。第4回」でやりました。Quit();TranslateMessage(&msg);DispatchMessage(&msg);}}while(timeGetTime()<tim+1000/60);//60fps}return(FALSE);}データを作成してしまえば、あとは毎回各データのx,y座標にx,y増加量を足していき、画面に表示するだけです。今回はビデオメモリ(lpBack)を直接操作しているので、ビデオカードによっては「やたら遅い!」という事もあると思います。いった場合は、作業用バッファ(その2)としてオフスクリーンサーフェイスをシステムメモリ内に作成し、そこを直接操作してデータを書き込み、バックバッファへBltFastで転送、Flip・・・とすれば、多少は速くなると思いますのでやってみてください。blockworks.このサイトについてサイトマップRSSフィード。