DrawMask の拡大描画版はありません
すぐに実装するのも難しいので、今のところ MakeScreen と SetBlendGraphParam を使用した
擬似マスク処理しか方法がありません
1.MakeScreen の第三引数を TRUE にしたアルファチャンネル付きの、
マスクを適用したい描画を一時的に保存しておくためのグラフィックハンドル(A)と、
マスク画面の代わりとなるグラフィックハンドル(B)を作成
2.マスク画像としたい画像を LoadMask ではなく、LoadGraph で読み込む、ただ、LoadGraph の
前に SetUsePremulAlphaConvertLoad( TRUE ) ; を実行して「乗算済みα」の画像として読み込むようにしておく
3.メインループ開始
4.SetDrawScreen で (A)を描画対象にして、マスクを適用したい描画を行う、
このとき描画ブレンド設定は DX_BLENDMODE_PMA_ALPHA などの乗算済みαの画像を描画
する設定にしておく必要があります
5.SetDrawScreen で (B)を描画対象にして、適用したいマスク画像を描画する
マスク画像と言っても「マスク画像として使用する普通の画像」なので、描画には
DrawGraph や DrawExtendGraph などの通常の画像を描画する関数を使用して行います
尚、このとき描画ブレンド設定は DX_BLENDMODE_PMA_ALPHA などの乗算済みαの画像を描画
する設定にしておく必要があります
6.SetDrawScreen で描画対象を裏画面に変更
7.SetBlendGraphParam で第一引数に(B)を、第二引数を DX_BLENDGRAPHTYPE_ALPHA にして呼び、
DrawGraph で描画する画像に対して(B)のα値を適用するように設定する
8.DrawGraph で画面に(A)を描画する
( SetBlendGraphParam の設定によって、(B)のα値と合成されて描画されるので、擬似的にマスクの処理を行うことができます )
尚、このときの描画ブレンド設定も DX_BLENDMODE_PMA_ALPHA などの乗算済みαの画像を描画
する設定にしておく必要があります
上記で頻繁に出てくる「乗算済みα」についての解説はこちらをご覧ください
http://homepage2.nifty.com/natupaji/DxLib/lecture/PremulAlpha/PremulAlpha.html
アルファチャンネルを持つ画像に対して描画を行う場合、「乗算済みα」を使用しないと正常な
描画結果が得られないので、アルファチャンネル付きの画面用画像を MakeScreen で作成した場合は
必ず使用することになります
上記の方法を使って擬似マスク処理を行うサンプルを作成しましたので、よろしければご覧になってみてください
実行すると Test1.bmp の形をしたマスクが左右に移動します
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SubScreenHandle ;
int MaskScreenHandle ;
int i ;
int GrHandle ;
int x ;
int add_x ;
// ウインドウモードで起動
ChangeWindowMode( TRUE );
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 『マスクを適用する描画結果を一時的に保存するための画面』用のグラフィックハンドルを作成
SubScreenHandle = MakeScreen( 640, 480, TRUE ) ;
// 『適用するマスクとなる画面』用のグラフィックハンドルを作成
MaskScreenHandle = MakeScreen( 640, 480, TRUE ) ;
// 乗算済みαのグラフィックハンドルを作成する設定にする
SetUsePremulAlphaConvertLoad( TRUE ) ;
// 画像の読み込み
GrHandle = LoadGraph( "Test1.bmp" ) ;
// 設定を元に戻す
SetUsePremulAlphaConvertLoad( FALSE ) ;
// 画面内を左右に移動するマスク画像の移動処理用変数の初期化
x = 0 ;
add_x = 8 ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面内を左右に移動するマスク画像の移動処理
x += add_x ;
if( x <= 0 || x >= 640 )
{
add_x = -add_x ;
}
// 描画先を『マスクを適用する描画結果を一時的に保存するための画面』用のグラフィックハンドルに変更
SetDrawScreen( SubScreenHandle ) ;
// 画面を初期化
ClearDrawScreen() ;
// 乗算済みαの画像を描画する設定にする
SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ;
// 読み込んだ画像を横に並べて描画
for( i = 0 ; i < 6 ; i ++ )
{
DrawGraph( i * 119, 0, GrHandle, TRUE ) ;
}
// 描画先を『適用するマスクとなる画面』用のグラフィックハンドルに変更
SetDrawScreen( MaskScreenHandle ) ;
// 画面を初期化
ClearDrawScreen() ;
// 乗算済みα描画をする設定にする
SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ;
// 画面内を左右に移動するマスク画像の描画
DrawGraph( x, 0, GrHandle, TRUE ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 画面を初期化
ClearDrawScreen() ;
// 描画する画像にブレンドする画像として『適用するマスクとなる画面』用のグラフィックハンドルを設定
SetBlendGraphParam( MaskScreenHandle, DX_BLENDGRAPHTYPE_ALPHA ) ;
// 乗算済みαの画像を描画する設定に変更
SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ;
// 『マスクを適用する描画結果を一時的に保存するための画面』用のグラフィックハンドルを描画
// SetBlendGraphParam の設定により MaskScreenHandle のα値と合成されて描画されます )
DrawGraph( 0, 0, SubScreenHandle, TRUE ) ;
// ブレンドする画像の設定を解除
SetBlendGraphParam( -1, -1 ) ;
// 裏画面の内容を表画面に変更
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
あと、今回のサンプルプログラムを作成する過程で SetBlendGraphParam 関係のバグが見つかり、
修正しましたので、お手数で申し訳ありませんがこちらのバージョンをお使いください m(_ _;m
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用
http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
> ただ同様にウィンドウのサイズが変更可能なため、用意したソフトイメージも拡大縮小を行いたいのですがどのようにすればよいでしょうか?
ウインドウのサイズが変更可能とのことですが、サイズの変更はどのようなタイプでしょうか?
1.ウインドウのサイズを変更すると、ウインドウのサイズに応じてウインドウ内の描画が単純に拡大される
主にゲームソフトでよくあるタイプ
2.ウインドウのサイズを変更すると、ウインドウのサイズに応じてウインドウ内の描画は拡大されずに、
表示されるもの( 表示される範囲、情報量 )が多くなる一般的なウインドウソフトのタイプ