サンプルコードのダウンロード
では、まずサンプルコードをダウンロードし、解凍してください。
私はVisual C++6.0でコンパイルしているので、お持ちの方はVisual C++でプロジェクトファイルを開いてください(「effec_03.dsw」をダブルクリックすれば開けます)。
圧縮ファイルに含まれる「effec_03.exe」をダブルクリックし、実行してみてください(何かキーを押すと終了します)。
どうでしょう?画面が切り替わり、うねうね揺れた地球の画像が2パターン表示されると思います。
というわけで今回も、サインカーブを使用して画像を揺らす方法ついて説明したいと思います。
地球を歪ませる その2
さて、みなさん「波」と言われて何を思い浮かべるでしょう?真夏の砂浜?ビーチバレー?水着?
前回紹介した「揺れる地球」は、「輪ゴムを伸ばして弦をはじいたような上下の揺れのようなもの。」
今回の揺れる地球」は、「音波のように伸びたり縮んだりする波(横波?)」です(超謎)。
高校の物理でそんなのを習ったような気がしましたが忘れました・・・。
というわけで、サンプルコードを見てみましょう。
//----------[ メイン関数 ]---------------------------------------------------------------------- int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow){ 略 //パレット設定 LoadPalette("earth.bmp"); //ビットマップを作業用サーフェイスへ読み込む LoadBitmap(lpWork,"earth.bmp",60,15,200,210); //透明色を設定 SetTransColor(lpWork,0); int count=0,i; float width=0.f,width_max=50,width_add=0.15f; DWORD tim; while(1){ tim=timeGetTime(); //疑似タイマー処理 ClearScreen(lpBack); //バックバッファクリア count++; //カウンタ //ゆれの大きさを時間によって変化させる(各パターン共通) if(width_add>0){ if((width+=width_add)>width_max) width_add=-width_add; } else { if((width+=width_add)<0){ width=0; width_add=-width_add; } } //ゆらすパターン4(補間無し) for(i=0;i<240;i++) BltClip(lpBack,0,120+i+int(sin((count+i)/10.f)*width), 320,1,lpWork,0,i,TRUE); //ゆらすパターン5(補間有り) int y,y_old,y_new=0; for(i=0;i<240;i++){ y_old=y_new; y_new=120+i+int(sin((count+i)/10.f)*width); if(i!=0){ if(y_old<y_new) for(y=y_old;y<y_new;y++) BltClip(lpBack,320,y,320,1,lpWork,0,i,TRUE); else for(y=y_old;y>y_new;y--) BltClip(lpBack,320,y,320,1,lpWork,0,i,TRUE); } } Flip(); //フリッピング do{ //メッセージループ while(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){ if(!GetMessage(&msg,NULL,0,0)) Quit(); TranslateMessage(&msg); DispatchMessage(&msg); } }while(timeGetTime()<tim+16); //1000/60=16.666(秒間60回更新予定) } return(FALSE); }
さて、順番に説明していきましょうか。
まずパレットを読み込み、地球の画像をlpWorkサーフェイスへ読み込んでおきます。
この辺は前回と全く同じですが、今回は透明色付きの転送を使用するので透明色の設定をしておきます。
サンプルプログラムを実行すると、2種類表示されますが、左のものがパターン4、右のがパターン5です。
横に薄く切った画像を縦にずらしながら表示する感じです。
ただ、このままパターン4のようにやってしまうと、サンプルプログラム実行時の左の画像のように「画像が切れる(隙間が出来る)」ため、美しくありません(?)
そこで、その間を補ったものがパターン5となります。
//ゆらすパターン4(補間無し) for(i=0;i<240;i++) BltClip(lpBack,0,120+i+int(sin((count+i)/10.f)*width), 320,1,lpWork,0,i,TRUE); //ゆらすパターン5(補間有り) int y,y_old,y_new=0; for(i=0;i<240;i++){ y_old=y_new; y_new=120+i+int(sin((count+i)/10.f)*width); if(i!=0){ if(y_old<y_new) for(y=y_old;y<y_new;y++) BltClip(lpBack,320,y,320,1,lpWork,0,i,TRUE); else for(y=y_old;y>y_new;y--) BltClip(lpBack,320,y,320,1,lpWork,0,i,TRUE); } }
お、今回は短い(^^;