まずは、どんなエフェクトを作ろうとしているか、映像をご覧ください。以下の映像の 0:31~ 位です。
(0:31~)
フレームが部分的に光りながら回転します。
このように「画像の一部を光らせる」には「マスク」を利用します。
マスクの使い方についてはこちらで紹介予定です。
4.11章 マスクを使って特定の部分だけを描画する (注:未制作)
まず、
この画像をぐるぐる回転させます。
回転するときは DrawRotaGraph2関数 を使って回転の中心点を指定して回転させます。
関数の使い方はリファレンスやこちらをご覧ください。
そして、以下のような画像を用意し、
黒い所だけを描画可能エリアにします。
描画可能エリアのみを加算ブレンドでブレンドすると・・。
このようになりますね。
では、下に表示する表示する画像と合わせて描画するとどうなるか、以下実行結果と合わせてご覧ください。
ピュアC版
/* MenuBack.h */
void MenuBack_Load(); void MenuBack_Delete(); void MenuBack_Calc(); void MenuBack_Graph();
/* MenuBack.cpp */
#include "DxLib.h" #include "MenuBack.h" #define PI2 (3.141592654f*2) static int m_imgBack; static int m_imgMask; static int m_imgOverLay; static int m_Count; // 読み込み void MenuBack_Load(){ m_imgBack = LoadGraph("img/top_back.png"); m_imgMask = LoadMask("img/menu_back_mask.png"); m_imgOverLay = LoadGraph("img/menu_back_over.png"); m_Count = 0; } // 削除 void MenuBack_Delete(){ DeleteGraph( m_imgBack ); DeleteGraph( m_imgMask ); DeleteGraph( m_imgOverLay ); } // 回転計算(というよりカウンタ加算してるだけ) void MenuBack_Calc(){ m_Count++; } // 描画 void MenuBack_Graph(){ DrawGraph( 0, 0, m_imgBack, FALSE ); // 背景描画 CreateMaskScreen(); // マスクここから DrawMask( 0, 0, m_imgMask, DX_MASKTRANS_BLACK ); // 黒い所のみを描画領域に SetDrawBlendMode( DX_BLENDMODE_ADD, 255 ); // 加算ブレンドに設定 DrawRotaGraph2 ( 320, 240, 370, 370 , 1.0, PI2/240*m_Count, m_imgOverLay , TRUE); DrawRotaGraph2 ( 320, 240, 370, 370 , 1.0, PI2/240*(m_Count-120), m_imgOverLay , TRUE); SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 ); // ブレンドモードリセット DeleteMaskScreen(); // マスクここまで }
/* main.cpp */
#include "DxLib.h" #include "MenuBack.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); MenuBack_Load(); // 素材ロード while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){ MenuBack_Calc(); // 回転計算 MenuBack_Graph(); // 描画 } MenuBack_Delete(); // 素材削除 DxLib_End(); return 0; }
実行結果
C言語版 プロジェクトファイルはこちら
C++版 プロジェクトファイルはこちら
C言語版もC++を意識した書き方をしてみました。
C++とほとんど設計としては変わりありません。
このように書くことで、main.cppからMenuBack.cppのグローバル変数を侵す危険性が無くなりました。
MenuBack.cppのグローバル変数はこのファイル内でしか変更されることが無いので、設計が大規模になっても、
変数が変更されるタイミングの把握がしやすいのです。
今回、MenuBack_Calc関数 でほとんど何も処理をしていません。
変数を減らすために角度の計算は省略しましたが、本来であれば、描画関数内で角度を求めるのではなく、
角度を代入する変数を用意し、角度の計算は MenuBack_Calc関数 で行うのがベストでしょう。
- Remical Soft -