SOFTドット絵エディタ「EDGE2」、MIDI音楽編集ソフト「Domino」、楽曲などを配布している個人サイトです。演出・エフェクト編サンプルコードのダウンロードでは、まずサンプルコードをダウンロードし、解凍してください。C++でプロジェクトファイルを開いてください(「effec_04.dsw」をダブルクリックすれば開けます)。圧縮ファイルに含まれる「effec_04.exe」をダブルクリックし、実行してみてください(何かキーを押すと終了します)。?画面が切り替わり、写真が波紋のような歪み方をすると思います(謎。いうわけで、今回もサインカーブを使用して画像を歪ませたいと思います。今回は解りづらいかもさて、今まで演出講座2・3回にてサインカーブを使用して地球を揺らしてきましたが、今回は右の写真のように、写真を波紋のように歪めてみます。今まで真面目に演出講座2・3回を勉強された方なら、おそらく写真を見ただけで「だいたいこうやっているのだろう」という見当は付いていると思います。んー、ちょっと初心者にはきつい内容かもしれないので、こんなものもあるんだぁーぐらいに流してください。いうかゲーム関連で、波紋使うかどうかは謎です。数学のお勉強さて今回はプログラム中に「直線距離の算出」をするので、まずここでざっと説明しておきます。左の図のように直角三角形がある場合、という公式があります(ピタゴラスの定理だったか?)。高校1年くらいには習うと思いますが(詳しくは数学の先生に聞いてください)。実際は、x座標,y座標があるので、点A(ax,ay)から点B(bx,by)の直線距離は以下の図のようになります。パソコン上の座標はY軸の方向が逆になるのですが、今回は2乗しているため符号が必ずプラスになるのでその辺を考える必要はありません。(ay-by)*(ay-by));みたいな感じになりますね。DirectDraw初期化さて、サンプルコードを見ながら順番に説明していきます。今回は基本的な部分はWinMain()内で全てやっていますが、DirectDrawの初期化の部分も少し変更していますので注意してください。グローバル変数としてlpGraphを宣言しておきます。これは写真を読み込んでおく場所として使用します。その2)宣言しただけでは意味が無いので、StartDirectDraw自作関数内でオフスクリーンサーフェイスを作成します。FALSE;今回の場合、オフスクリーンサーフェイスへは、頻繁に直接アクセスするのでDDSCAPS_SYSTEMMEMORYを指定して強制的にシステムメモリ内へ作成します(ビデオメモリ内サーフェイスへの直接アクセスは速度が遅い)。DirectDrawの設定はこれぐらいです。あ、ちなみに最後にlpGraphを解放するのを忘れないようにしてくださいね。解らない解説まず写真(bridge.bmp)をあらかじめ作成しておいたオフスクリーンサーフェイス(lpGraph)へ読み込んでおきます。略//DirectDraw開始StartDirectDraw(hw);//パレット設定LoadPalette("bridge.bmp");//ビットマップを作業用サーフェイスへ読み込むLoadBitmap(lpGraph,"bridge.bmp",0,0,320,240);次に、高速化のためにサイン・コサインテーブルを作成します。i=0;i<256;i++){fsin[i]=(float)sin(i*3.1415926535/128);fcos[i]=(float)cos(i*3.1415926535/128);}普通は360度で一周ですが、今回は256度で一周とします。char型)にキャストするだけで不正なアクセスを防ぐことが出来ます。次に、あらかじめ各座標毎に、中心からの距離・中心への角度(0-255度)を算出しておきます。これも高速化のためです。第11回」でやりました。{//0まで戻してしまうとちょっと歪むのでやめるif((width+=width_add)<=0.05f){width=0.05f;width_add=-width_add;}}↑のは大体解ると思います。ゆれの大きさの部分に関しては前回・前々回と大体同じです。次に、あらかじめ画像を読み込んでおいたサーフェイス(lpGraph)と、作業用サーフェイス(lpWork)をロックし、そのサーフェイスへの先頭アドレスを取得します。第12回」でやりました。そんでもって次のが心臓部。sy<240)color=*(p_src+pitch_src*sy+sx);*(p_dest++)=color;p_angle++;p_length++;}p_dest+=pitch_dest-320;}ポインタいじりまくりですね。ポインタの概念がしっかり解っていないと理解出来ないと思います。今までの演出は「転送先の座標を計算する」というパターンですが今回はこれでは穴が空くので逆に「転送先が転送元の座標を計算する」方法でやっています。画面全体(320×240)について全て計算を行います。おおまかに説明すると、「画面中心からの距離(p_length)+時間(count)」を使ってサインカーブを参照し、ゆれの幅を計算します。その揺れの幅分だけ転送元の座標を中央に向かってずらします。あとは転送元の色を転送先へ転送します。一通り終わったらロックを解除し、一度バックバッファへ転送し、フリップして画面に表示させます。解ってしまえば簡単ですね(^^;細かい部分で何か解らない事があれば掲示板へどうぞ。blockworks.このサイトについてサイトマップRSSフィード。