トップページ > 記事閲覧
透明な背景
名前:cola 日時: 2013/10/17 04:24

透明な背景
メンテ

Page: 1 |

Re: 透明な背景 ( No.1 )
名前:cola 日時:2013/10/17 04:28

こんにちは Your work is awesome,I enjoy a lot. Now I meet a problem.I try to make the background transparent,but I failed. Can you tell me how to make it?For example,I draw a 'PNG' picture,which contains a red circle and the outside of the circle is transparent.However ,when I draw it in dxlib,the outside is black. below is my code. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { SetWindowStyleMode(2); ChangeWindowMode(TRUE); if( DxLib_Init() == -1 ){return -1 ;} SetDrawValidAlphaChannelGraphCreateFlag(TRUE); ChangeWindowMode(TRUE); SetDrawScreen(DX_SCREEN_BACK); int circle_pic; circle_pic = LoadGraph("circle.png"); while (1) { DrawGraph(0,0,circle_pic,TRUE); ScreenFlip(); } WaitKey() ; DxLib_End() ; return 0 ; }
メンテ
Re: 透明な背景 ( No.2 )
名前:レモン茶 日時:2013/10/17 23:47

DX_SCREEN_BACK surface have to clear whenever before drawing. rewrite main loop this code. // ProcessMessage is default window procedure on DxLib. it need to call. while (ProcessMessage() == 0 ) { SetDrawScreen(DX_SCREEN_BACK); // clear surface. ClearDrawScreen(); DrawGraph(0,0,circle_pic,TRUE); ScreenFlip(); } 英語できないのでこれで伝わるかわかりませんが。 スクリーンをクリアせず、画像の描画を繰り返しているので、半透明の部分が上書きされ続け、エッジのようなものが出ているのだと思います。
メンテ
Re: 透明な背景 ( No.3 )
名前:管理人 日時:2013/10/19 01:39

もしかして透過ウインドウをお求めでしょうか? とりあえず透過ウインドウをお求めという前提でお話します 透過ウインドウを実現するには DxLib_Init を呼ぶ前に SetUseBackBufferTransColorFlag( TRUE ) ; を呼び、 画像情報の更新には ScreenFlip の代わりに UpdateLayerdWindowForPremultipliedAlphaSoftImage を使用します UpdateLayerdWindowForPremultipliedAlphaSoftImage に渡す乗算済みアルファのソフトウエアイメージは まずアルファチャンネル付きの描画対象にできる画像を MakeScreen で作成して、作成した画像を SetDrawScreen で 描画対象にして、作成した画像に対して乗算済みアルファのブレンドモードで描画します 描画が終わったら、描画結果を GetDrawScreenSoftImage でソフトウエアイメージに取り込みます 尚、乗算済みアルファの詳細についてはこちらをご参照ください http://homepage2.nifty.com/natupaji/DxLib/lecture/PremulAlpha/PremulAlpha.html あと、サンプルプログラムを作成してみました 透過ウインドウを使用して Test1.bmp を明滅させるプログラムです #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GrHandle ; int Screen ; int SoftImage ; int AlphaAdd ; int Alpha ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // 透過ウインドウ設定 SetUseBackBufferTransColorFlag( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 描画対象にできるアルファチャンネル付き画面を作成 Screen = MakeScreen( 640, 480, TRUE ) ; // 画面取り込み用のソフトウエア用画像を作成 SoftImage = MakeARGB8ColorSoftImage( 640, 480 ) ; // 画像を読み込む際にアルファ値をRGB値に乗算するように設定する SetUsePremulAlphaConvertLoad( TRUE ) ; // 画像の読み込み GrHandle = LoadGraph( "Test1.bmp" ); // 描画先を描画対象にできるアルファチャンネル付き画面にする SetDrawScreen( Screen ); // メインループ AlphaAdd = -8 ; Alpha = 255 ; while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; // アルファ値の変更 Alpha += AlphaAdd ; if( Alpha <= 0 ) { Alpha = 0 ; AlphaAdd = 8 ; } else if( Alpha >= 255 ) { Alpha = 255 ; AlphaAdd = -8 ; } // 描画ブレンドモードを乗算済みアルファにセット SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, Alpha ) ; // 画像を描画 DrawGraph( 0, 0, GrHandle, TRUE ) ; // 描画先の画像をソフトイメージに取得する GetDrawScreenSoftImage( 0, 0, 640, 480, SoftImage ) ; // 取り込んだソフトイメージを使用して透過ウインドウの状態を更新する UpdateLayerdWindowForPremultipliedAlphaSoftImage( SoftImage ) ; // 少し待つ Sleep( 12 ) ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: 透明な背景 ( No.4 )
名前:cola 日時:2013/10/19 21:29

透明な背景 Oh,I use 管理人's code and it works : ) Thanks,レモン茶,管理人
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存