そのような機能が無かったので、機能を追加しました
ただ、現在のマスクスクリーンへの描画を行う DrawMask や SetDataToMask などに拡大描画や変形描画を
追加すると関数の数が結構増えてしまうので、MakeScreen で作成した
「描画対象にできるアルファチャンネル付きのグラフィックハンドル」をマスクスクリーンとして
使用できるようにする機能を追加しました
よろしければこちらをダウンロードしてください
https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
以下の関数を追加しました
// マスクスクリーンとして使用するグラフィックのハンドルを設定する、-1を渡すと解除
// ( 引数で渡すグラフィックハンドルは MakeScreen で作成した
// 「アルファチャンネル付きの描画対象にできるグラフィックハンドル」である必要があります
// ( アルファチャンネルがマスクに使用されます ) )
int SetMaskScreenGraph( int GraphHandle ) ;
MakeScreen の第三引数に TRUE を渡して呼び出すと
「描画対象にできる( SetDrawScreen の引数として渡せる )アルファチャンネル付きのグラフィックハンドル」
が作成できますが、そのグラフィックハンドルを SetMaskScreenGraph に引数として渡して呼び出すと
そのグラフィックハンドルがマスクスクリーンとして機能します
( そしてグラフィック中のアルファチャンネルの部分が「マスク」として使用されます )
MakeScreen で作成したグラフィックハンドルは SetDrawScreen に引数として渡すことで描画対象とすることができますので、
マスクスクリーンへの書き込みは DrawMask 等ではなく通常の描画関数である DrawGraph や DrawBox などで行います
この機能を使用して画像を DrawExtendGraph で拡大したものをマスクとして使用するサンプルを作成してみましたので、
よろしければご覧ください
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int GraphHandle ;
int ScreenHandle ;
int x, add ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 画像を読み込み
GraphHandle = LoadGraph( "Test1.bmp" ) ;
// マスクスクリーンに使うアルファチャンネル付きの描画対象にできるグラフィックハンドルを作成
ScreenHandle = MakeScreen( 640, 480, TRUE ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// マスク機能の初期化を行う
CreateMaskScreen() ;
// マスクスクリーンに使用するグラフィックハンドルとして MakeScreen で作成したグラフィックハンドルをセット
SetMaskScreenGraph( ScreenHandle ) ;
// 画像の移動処理用の変数を初期化
x = 0 ;
add = 8 ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画像の移動処理
x += add ;
if( x < 0 || x > 640 )
{
add = -add ;
}
// 描画先をマスク用の画像に変更
SetDrawScreen( ScreenHandle ) ;
// マスク用の画像をクリア
ClearDrawScreen() ;
// 画像を横に2倍拡大して描画
DrawExtendGraph( x, 0, x + 119 * 2, 480, GraphHandle, TRUE ) ;
// 描画先を裏画面に変更
SetDrawScreen( DX_SCREEN_BACK ) ;
// 裏画面をクリア
ClearDrawScreen() ;
// マスクを有効にする
SetUseMaskScreenFlag( TRUE ) ;
// 画面いっぱいに黄色い四角形を描画
DrawBox( 0, 0, 640, 480, GetColor( 255,255,0 ), TRUE ) ;
// マスクを無効にする
SetUseMaskScreenFlag( FALSE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
あと、SetDrawBlendMode( DX_BLENDMODE_ALPHA, 128 ) ; などを使用して「マスクスクリーンに見立てる描画対象にできるグラフィックハンドル」に対して
半透明の描画を行った場合、マスクも半透明になりますので、それを利用して半透明マスクの効果を得ることもできます、
これは今までのマスク機能には無かったので新しい表現ができるかもしれません
よろしければお試しください m(_ _)m