ページ 1 / 1
DxLibのマスクとDrawRectGraph
Posted: 2014年11月28日(金) 08:59
by chain
はじめまして、chainと申します。
質問なのですが、DxLibでDrawMaskなどでマスクの描画を行い、
その後にDrawRectGraph関数を用いてマスクの範囲内に描画を行うと描画できないのですが、
何か使い方が間違っているのか、そもそも使えないのか教えていただけたらと思います。
DrawRectGraph関数の場所をDrawBoxなどに変えると描画できる為、マスク設定自体はできていると思うのですが。
今ソースが手元にないため、大まかに処理の流れをかきますと、CreateMaskScreen()をした後、MakeMask()でマスクハンドルを取得、
配列で2値のマスクを作成し、SetDataToMask()でハンドルに渡します。
その後、DrawMaskでマスク描画を行い、画面全体にマップチップをDrawRectGraphで敷き詰めますが、真っ暗になってしまいます。
よろしければご教授ください。
Re: DxLibのマスクとDrawRectGraph
Posted: 2014年11月29日(土) 20:07
by softya(ソフト屋)
問題を再現できるソースコードを掲載してもらうと返答が付くかと思います。
なお、DXLIBのバージョン情報も一緒に必要です。
Re: DxLibのマスクとDrawRectGraph
Posted: 2014年11月30日(日) 06:28
by chain
レスありがとうございます。
実際の使用コードから最低限と思われる部分を抜き出してきました。(一部書き換えてはいますが)
コメント部分を変えることでマスクの有り無し、DrawBoxの場合が比べられるかと思います。
また、DxLibのバージョンですが、Ver 3.13を使用しております。
コード:
#include "DxLib/DxLib.h"
#include <math.h>
int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
LPSTR lpCmdLine ,
int nCmdShow )
{
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
DxLib_Init();
int win_Wid, win_Hei, win_Cb;
GetScreenState( &win_Wid, &win_Hei, &win_Cb );
CreateMaskScreen();
int img_Wid = 32;
int img_Hei = 32;
int* GHandle = new int[224];
LoadDivGraph( _T("sozai/map1.png") , 224 , 8 , 28 , img_Wid , img_Hei , GHandle ) ;
int MaskHandle = MakeMask(win_Wid, win_Hei);
int draw_X = 0;
int draw_Y = 50;
unsigned char mLight[480][640];
//SetUseMaskScreenFlag( FALSE );
while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){
for(int x = 0; x<win_Wid; x++){
for(int y = 0; y<win_Hei; y++){
mLight[y][x] = 0xff;
}
}
double harfD = 2*32;
for(int i = (int)(win_Wid / 2 + draw_X - harfD); i<=win_Wid / 2 + draw_X + harfD; i++){
int r = (int)floor(sqrt(pow(harfD, 2) - pow((double)(win_Wid / 2 + draw_X - i), 2)));
for(int j = (int)(win_Hei / 2 + draw_Y - r) ; j<= win_Hei / 2 + draw_Y + r; j++){
if(i < win_Wid && i >= 0 && i < win_Hei && i >= 0){
mLight[j][i] = 0;
}
}
}
SetDataToMask( win_Wid, win_Hei, mLight, MaskHandle);
DrawMask( 0, 0, MaskHandle, DX_MASKTRANS_BLACK);
for(int map_Y = 0; map_Y * img_Hei < win_Hei; map_Y++){
for(int map_X = 0; map_X * img_Wid < win_Wid; map_X++){
//DrawBox(0, 0, win_Wid, win_Hei, GetColor(255, 0, 0), TRUE );
DrawRectGraph( map_X * img_Wid + draw_X, map_Y * img_Hei + draw_Y, 0, 0, 32, 32, GHandle[76], TRUE, FALSE ) ;
}
}
}
DxLib_End();
return 0;
}
DrawBoxだとマスク有効時にも描画でき、DrawRectGraphでは自分の環境ではできません。
何かミスなどがあれば教えていただけると助かります。
Re: DxLibのマスクとDrawRectGraph
Posted: 2014年11月30日(日) 19:51
by softya(ソフト屋)
こうすると円状に繰り抜かれた白丸が表示されるのでマスクはうまく動いていると思えるのですが。
勘違いならすいません。
コード:
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
LPSTR lpCmdLine ,
int nCmdShow )
{
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
DxLib_Init();
int win_Wid, win_Hei, win_Cb;
GetScreenState( &win_Wid, &win_Hei, &win_Cb );
CreateMaskScreen();
int img_Wid = 32;
int img_Hei = 32;
int* GHandle = new int[224];
// LoadDivGraph( _T("sozai/map1.png") , 224 , 8 , 28 , img_Wid , img_Hei , GHandle ) ;
int MaskHandle = MakeMask(win_Wid, win_Hei);
int draw_X = 0;
int draw_Y = 50;
unsigned char mLight[480][640];
//SetUseMaskScreenFlag( FALSE );
while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){
for(int x = 0; x<win_Wid; x++){
for(int y = 0; y<win_Hei; y++){
mLight[y][x] = 0xff;
}
}
double harfD = 2*32;
for(int i = (int)(win_Wid / 2 + draw_X - harfD); i<=win_Wid / 2 + draw_X + harfD; i++){
int r = (int)floor(sqrt(pow(harfD, 2) - pow((double)(win_Wid / 2 + draw_X - i), 2)));
for(int j = (int)(win_Hei / 2 + draw_Y - r) ; j<= win_Hei / 2 + draw_Y + r; j++){
if(i < win_Wid && i >= 0 && i < win_Hei && i >= 0){
mLight[j][i] = 0;
}
}
}
SetDataToMask( win_Wid, win_Hei, mLight, MaskHandle);
DrawMask( 0, 0, MaskHandle, DX_MASKTRANS_BLACK);
for(int map_Y = 0; map_Y * img_Hei < win_Hei; map_Y++){
for(int map_X = 0; map_X * img_Wid < win_Wid; map_X++){
//DrawBox(0, 0, win_Wid, win_Hei, GetColor(255, 0, 0), TRUE );
// DrawRectGraph( map_X * img_Wid + draw_X, map_Y * img_Hei + draw_Y, 0, 0, 32, 32, GHandle[76], TRUE, FALSE ) ;
int x1 = map_X * img_Wid + draw_X;
int y1 = map_Y * img_Hei + draw_Y;
DrawBox( x1 , y1 , x1+32 , y1+32 , GetColor(255,255,255), TRUE );
}
}
}
DxLib_End();
return 0;
}
Re: DxLibのマスクとDrawRectGraph
Posted: 2014年11月30日(日) 20:06
by softya(ソフト屋)
すいません。やっぱり勘違いしてました。
DrawRectGraphだけダメなようです。DrawGraphではマスク表示されます。
これは、DXLIBのご本家の掲示板で質問していただくのが一番のようです。
Re: DxLibのマスクとDrawRectGraph
Posted: 2014年12月01日(月) 03:55
by chain
ご回答ありがとうございました。
あちらの掲示板でスレッドを立てましたので、こちらでは
一応解決という形を取ろうかと思います。
続きや回答が気になった方は本家の掲示板の「マスク有効時のDrawRectGraph」というタイトルのスレを
ご覧ください。ありがとうございました。