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,レモン茶,管理人
|
|