トップページ > 過去ログ > 記事閲覧
αブレンド
名前:ライブラリ使用者 日時: 2008/10/21 22:39

#include "DxLib.h" #pragma warning(disable : 4996) int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { char Buf[256]; BOOL cb_MouseRFlg = FALSE; int BlendGraph, GrHandle1, GrHandle2, GrHandle3 ; int index = 0; int blend_pattarn[5]; blend_pattarn[0] = DX_BLENDMODE_NOBLEND; //ブレンドなし blend_pattarn[1] = DX_BLENDMODE_ALPHA; //αブレンド blend_pattarn[2] = DX_BLENDMODE_ADD; //加算ブレンド blend_pattarn[3] = DX_BLENDMODE_SUB; //減算ブレンド blend_pattarn[4] = DX_BLENDMODE_MUL; //乗算ブレンド //blend_pattarn[4] = DX_BLENDMODE_MULA; //乗算ブレンド //blend_pattarn[5] = DX_BLENDMODE_INVSRC; //反転ブレンド char blend_text[5][30]; strcpy(blend_text[0],"DX_BLENDMODE_NOBLEND"); strcpy(blend_text[1],"DX_BLENDMODE_ALPHA"); strcpy(blend_text[2],"DX_BLENDMODE_ADD"); strcpy(blend_text[3],"DX_BLENDMODE_SUB"); strcpy(blend_text[4],"DX_BLENDMODE_MUL"); //strcpy(blend_text[4],"DX_BLENDMODE_MULA"); //strcpy(blend_text[5],"DX_BLENDMODE_INVSRC"); int blend_case = blend_pattarn[index]; // ウインドウモードに変更 ChangeWindowMode( TRUE ); if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1 ; // エラーが起きたら直ちに終了 } // 裏画面を使用 SetDrawScreen( DX_SCREEN_BACK ) ; //ウインドウがアクティブではない状態でも処理を続行する SetAlwaysRunFlag(TRUE); // 二つの画像の読み込み GrHandle1 = LoadGraph( "./bmp/***.bmp" ) ; GrHandle2 = LoadGraph( "./bmp/***.bmp" ) ; int x,y; GetGraphSize(GrHandle2,&x,&y); while(1) { // メッセージループに代わる処理をする if( ProcessMessage() == -1 ) { break ; // エラーが起きたらループを抜ける } //キーボード入力があれば処理する if(CheckHitKeyAll(DX_CHECKINPUT_KEY) != 0) { //キーボード入力状態を取得 GetHitKeyStateAll(&Buf[0]); //ESCチェック if(Buf[KEY_INPUT_ESCAPE]) { break; } } //左マウス押下処理 if((GetMouseInput() & MOUSE_INPUT_RIGHT) != 0) { //LBUTTONDOWN時の場合のみ処理する if(cb_MouseRFlg == FALSE) { index++; if(index > 4) index = 0; //::MessageBoxA(NULL,"左マウス押下","Sample",MB_OK); cb_MouseRFlg = TRUE; } } else { //マウスクリック判定(LBUTTON押下検知後、押し続け処理させない) if(cb_MouseRFlg == TRUE) { cb_MouseRFlg = FALSE; } } ClearDrawScreen() ; //パラメータ強度 一律200 SetDrawBlendMode( blend_pattarn[index] , 200 ) ; // 背景を描画 DrawGraph( 0 , 0 , GrHandle1 , FALSE ) ; // 上に載せるグラフィックを描画 DrawGraph( 0 , 0 , GrHandle2 , TRUE ) ; // グラフィックの部分を画面座標(100,100)に // 透過色処理あり、反転処理なしで描画 //DrawRectGraph( 100, 100, 0, 0, x, y, GrHandle2, TRUE, FALSE ) ; //->指定範囲外もブレンドされている SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ; DrawString(0,0,blend_text[index],GetColor(255,0,0)); // 裏画面の内容を表画面に反映 ScreenFlip() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

Page: 1 |

Re: αブレンド ( No.1 )
名前:ライブラリ使用者 日時:2008/10/21 22:49

質問内容 ・画像サイズが背景画像>上に載せるグラフィックの場合にαブレンドを実行した時に、上に載せるグラフィックの画像領域分のみにかかって欲しいのですが、全画面に対してαブレンドしてしまい、全体的にやや暗くなってしまいます。 これでいいのでしょうか?(仕様?) また、αブレンドする領域を決めたい場合どのようにすれば良いのでしょうか? 追加 ブレンドモードですが、HPマニュアルの記載と実際に設定可能なモードが食い違っています。 >管理人様、確認お願いします。
Re: αブレンド ( No.2 )
名前: 日時:2008/10/22 04:43

> 全体的にやや暗くなってしまいます。 >これでいいのでしょうか?(仕様?) 背景画面の黒に対して、 背景画像をαブレンドしているからでしょう。 >αブレンドする領域を決めたい場合 >どのようにすれば良いのでしょうか? 重ねたい画像のなかでさらに 指定したいということでしょうか?? 重ねる画像で表示する部分のみの αブレンドがしたいということなら、 透明色で抜かれた部分はブレンドの 対象にならないはずですが。。。 #除算はなぜかでてきてしまうけど。 こちらで試したもの貼っときます。 ポイントはブレンドを有効にするタイミングです。 #include "DxLib.h" #pragma warning(disable : 4996) int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { char Buf[256]; BOOL cb_MouseRFlg = FALSE; int BlendGraph, GrHandle1, GrHandle2, GrHandle3 ; int index = 0; int blend_pattarn[] = { DX_BLENDMODE_NOBLEND, //ブレンドなし DX_BLENDMODE_ALPHA, //αブレンド DX_BLENDMODE_ADD, //加算ブレンド DX_BLENDMODE_SUB, //減算ブレンド DX_BLENDMODE_MUL, //乗算ブレンド }; char * blend_text[] = { "DX_BLENDMODE_NOBLEND", "DX_BLENDMODE_ALPHA", "DX_BLENDMODE_ADD", "DX_BLENDMODE_SUB", "DX_BLENDMODE_MUL", }; int blend_case = blend_pattarn[index]; ChangeWindowMode( TRUE ); if( DxLib_Init() == -1 ){return -1 ;} //このプログラムで使用するカラーキーを紫に指定 SetTransColor( 255, 0, 255 ); SetDrawScreen( DX_SCREEN_BACK ) ; SetAlwaysRunFlag(TRUE); GrHandle1 = LoadGraph( "./bmp/aaa.bmp" ) ; GrHandle2 = LoadGraph( "./bmp/bbb.bmp" ) ; int x,y; GetGraphSize(GrHandle2,&x,&y); while(1){ if( ProcessMessage() == -1 ){break ;} if(CheckHitKeyAll() != 0) { GetHitKeyStateAll(&Buf[0]); if(Buf[KEY_INPUT_ESCAPE]){ break; } } if((GetMouseInput() & MOUSE_INPUT_RIGHT) != 0){ if(cb_MouseRFlg == FALSE){ index++; if(index > 4) index = 0; cb_MouseRFlg = TRUE; } }else{ if(cb_MouseRFlg == TRUE){ cb_MouseRFlg = FALSE; } } //画面クリア後背景描画 ClearDrawScreen() ; DrawGraph( 0 , 0 , GrHandle1 , FALSE ) ; //背景描画後に移動 //「背景に対する」ブレンドモードを指定する SetDrawBlendMode( blend_pattarn[index] , 200 ) ; DrawRectGraph( 100, 100, 0, 0, x, y, GrHandle2, TRUE, FALSE ) ; SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ; DrawString(0,0,blend_text[index],GetColor(255,0,0)); ScreenFlip() ; } DxLib_End() ; return 0 ; }
Re: αブレンド ( No.3 )
名前:ライブラリ使用者 日時:2008/10/23 22:40

解答ありがとうございます。 SetDrawBlendMode()呼ぶタイミングを記載頂いたタイミングで使う事で想定通りの結果となりました。 DrawGraph()の透過処理FALSE時の場合にも影響あったんですねぇ。 参考になりました。

Page: 1 |