はじめまして、chainと申します。
質問なのですが、DxLibでDrawMaskなどでマスクの描画を行い、
その後にDrawRectGraph関数を用いてマスクの範囲内に描画を行うと描画できないのですが、
何か使い方が間違っているのか、そもそも使えないのか教えていただけたらと思います。
DrawRectGraph関数の場所をDrawBoxなどに変えると描画できる為、マスク設定自体はできていると思うのですが。
今ソースが手元にないため、大まかに処理の流れをかきますと、CreateMaskScreen()をした後、MakeMask()でマスクハンドルを取得、
配列で2値のマスクを作成し、SetDataToMask()でハンドルに渡します。
その後、DrawMaskでマスク描画を行い、画面全体にマップチップをDrawRectGraphで敷き詰めますが、真っ暗になってしまいます。
よろしければご教授ください。
DxLibのマスクとDrawRectGraph
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibのマスクとDrawRectGraph
問題を再現できるソースコードを掲載してもらうと返答が付くかと思います。
なお、DXLIBのバージョン情報も一緒に必要です。
なお、DXLIBのバージョン情報も一緒に必要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DxLibのマスクとDrawRectGraph
レスありがとうございます。
実際の使用コードから最低限と思われる部分を抜き出してきました。(一部書き換えてはいますが)
コメント部分を変えることでマスクの有り無し、DrawBoxの場合が比べられるかと思います。
また、DxLibのバージョンですが、Ver 3.13を使用しております。
DrawBoxだとマスク有効時にも描画でき、DrawRectGraphでは自分の環境ではできません。
何かミスなどがあれば教えていただけると助かります。
実際の使用コードから最低限と思われる部分を抜き出してきました。(一部書き換えてはいますが)
コメント部分を変えることでマスクの有り無し、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;
}
何かミスなどがあれば教えていただけると助かります。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibのマスクとDrawRectGraph
こうすると円状に繰り抜かれた白丸が表示されるのでマスクはうまく動いていると思えるのですが。
勘違いならすいません。
勘違いならすいません。
#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;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibのマスクとDrawRectGraph
すいません。やっぱり勘違いしてました。
DrawRectGraphだけダメなようです。DrawGraphではマスク表示されます。
これは、DXLIBのご本家の掲示板で質問していただくのが一番のようです。
DrawRectGraphだけダメなようです。DrawGraphではマスク表示されます。
これは、DXLIBのご本家の掲示板で質問していただくのが一番のようです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DxLibのマスクとDrawRectGraph
ご回答ありがとうございました。
あちらの掲示板でスレッドを立てましたので、こちらでは
一応解決という形を取ろうかと思います。
続きや回答が気になった方は本家の掲示板の「マスク有効時のDrawRectGraph」というタイトルのスレを
ご覧ください。ありがとうございました。
あちらの掲示板でスレッドを立てましたので、こちらでは
一応解決という形を取ろうかと思います。
続きや回答が気になった方は本家の掲示板の「マスク有効時のDrawRectGraph」というタイトルのスレを
ご覧ください。ありがとうございました。