こんにちわ、Dxlib にはいつもお世話になっております。
只今、マスク画像を利用した描画をしようとしています。
しかしどういう訳でしょうか、上手くマスクが適用されませんでした。
そこで原因を模索していたのですが、どうやら分割する画像が PNG 画像の時だけ(?)、
LoadDivMask 関数を2回以上呼び出すと、"おかしな動作"をするようです。
この"おかしな動作"と言う表現は、とりあえずプログラムを数回に渡って実行していただくと分かります。
下記にある画像とサンプルコードを準備して、一度だけプログラムを実行します。
次に、/*!ココ!*/と言う部分の5つある LoadDivMask 関数。これらの実行順を適当に並び替えてから、もう一度だけ実行します。
・・・上記の通りしてみると、マスク画像が1つのハンドルにしか格納されていなかったりなど、正常に動作していない事が分かると思います。
お手数ですが、どうか修正の方よろしくお願いしますm(_ _)m
こちらが、実際に使おうとしている PNG 画像です。お手数ですが、ファイル名を「File0014_b64.png」と変更してください。
(サイズが大きいので、読み込みが長いです・・・すみません。)
get.secret.jp/pt/file/1527091594.png
以下のコードが、そのバグを再現できるサンプルコードです。
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE); //ウィンドウモードに設定
SetGraphMode(640, 480, 32); //DXライブラリの描画可能な領域サイズ設定
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
SetDrawScreen( DX_SCREEN_BACK ) ;
// マスク画面を作成します
CreateMaskScreen() ;
SetUseMaskScreenFlag(FALSE);
// マスクデータをロードします
int MaskHandle[2][350]={} , MaskHandle2[3][350]={};
/*!ココ!*/
LoadDivMask("File0014_b64.png", 350, 10, 35, 64, 64, MaskHandle[0]);
LoadDivMask("File0014_b64.png", 350, 10, 35, 64, 64, MaskHandle[1]);
LoadDivMask("File0014_b64.png", 350, 10, 35, 64, 64, MaskHandle2[0]);
LoadDivMask("File0014_b64.png", 350, 10, 35, 64, 64, MaskHandle2[1]);
LoadDivMask("File0014_b64.png", 350, 10, 35, 64, 64, MaskHandle2[2]);
while( !ProcessMessage() && !FillMaskScreen(0) && !ClearDrawScreen() )
{
// MaskHandle[0]の描画
if(DrawMask( 0 , 0 , MaskHandle[0][10] , DX_MASKTRANS_NONE ) != 0 )
{
DrawBox( 0, 0, 64, 64, GetColor( 0 , 0 , 255 ), TRUE );
}
else
{
SetUseMaskScreenFlag(TRUE);
DrawBox( 0 , 0 , 64 , 64 , GetColor( 255 , 0 , 0 ) , TRUE ) ;
SetUseMaskScreenFlag(FALSE);
}
// MaskHandle[1]の描画
if(DrawMask( 128 , 128 , MaskHandle[1][10] , DX_MASKTRANS_NONE ) != 0 )
{
DrawBox( 128, 128, 192, 192, GetColor( 0 , 0 , 255 ), TRUE );
}
else
{
SetUseMaskScreenFlag(TRUE);
DrawBox( 128 , 128 , 192 , 192 , GetColor( 255 , 0 , 0 ) , TRUE ) ;
SetUseMaskScreenFlag(FALSE);
}
// MaskHandle2[0]の描画
if(DrawMask( 256 , 256 , MaskHandle2[0][10] , DX_MASKTRANS_NONE ) != 0 )
{
DrawBox( 256, 256, 320, 320, GetColor( 0 , 0 , 255 ), TRUE );
}
else
{
SetUseMaskScreenFlag(TRUE);
DrawBox( 256 , 256 , 320 , 320 , GetColor( 255 , 0 , 0 ) , TRUE ) ;
SetUseMaskScreenFlag(FALSE);
}
// MaskHandle2[1]の描画
if(DrawMask( 192 , 192 , MaskHandle2[1][10] , DX_MASKTRANS_NONE ) != 0 )
{
DrawBox( 192, 192, 256, 256, GetColor( 0 , 0 , 255 ), TRUE );
}
else
{
SetUseMaskScreenFlag(TRUE);
DrawBox( 192 , 192 , 256 , 256 , GetColor( 255 , 0 , 0 ) , TRUE ) ;
SetUseMaskScreenFlag(FALSE);
}
// MaskHandle2[2]の描画
if(DrawMask( 64 , 64 , MaskHandle2[2][10] , DX_MASKTRANS_NONE ) != 0 )
{
DrawBox( 64, 64, 128, 128, GetColor( 0 , 0 , 255 ), TRUE );
}
else
{
SetUseMaskScreenFlag(TRUE);
DrawBox( 64 , 64 , 128 , 128 , GetColor( 255 , 0 , 0 ) , TRUE ) ;
SetUseMaskScreenFlag(FALSE);
}
ScreenFlip() ;
}
// マスクデータを削除します
InitMask() ;
// マスク画面を削除します
DeleteMaskScreen() ;
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}