DxLibのマスクとDrawRectGraph

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
chain

DxLibのマスクとDrawRectGraph

#1

投稿記事 by chain » 10年前

はじめまして、chainと申します。
質問なのですが、DxLibでDrawMaskなどでマスクの描画を行い、
その後にDrawRectGraph関数を用いてマスクの範囲内に描画を行うと描画できないのですが、
何か使い方が間違っているのか、そもそも使えないのか教えていただけたらと思います。

DrawRectGraph関数の場所をDrawBoxなどに変えると描画できる為、マスク設定自体はできていると思うのですが。
今ソースが手元にないため、大まかに処理の流れをかきますと、CreateMaskScreen()をした後、MakeMask()でマスクハンドルを取得、
配列で2値のマスクを作成し、SetDataToMask()でハンドルに渡します。
その後、DrawMaskでマスク描画を行い、画面全体にマップチップをDrawRectGraphで敷き詰めますが、真っ暗になってしまいます。
よろしければご教授ください。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DxLibのマスクとDrawRectGraph

#2

投稿記事 by softya(ソフト屋) » 10年前

問題を再現できるソースコードを掲載してもらうと返答が付くかと思います。
なお、DXLIBのバージョン情報も一緒に必要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

chain

Re: DxLibのマスクとDrawRectGraph

#3

投稿記事 by chain » 10年前

レスありがとうございます。
実際の使用コードから最低限と思われる部分を抜き出してきました。(一部書き換えてはいますが)
コメント部分を変えることでマスクの有り無し、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では自分の環境ではできません。
何かミスなどがあれば教えていただけると助かります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DxLibのマスクとDrawRectGraph

#4

投稿記事 by softya(ソフト屋) » 10年前

こうすると円状に繰り抜かれた白丸が表示されるのでマスクはうまく動いていると思えるのですが。
勘違いならすいません。

コード:

#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

#5

投稿記事 by softya(ソフト屋) » 10年前

すいません。やっぱり勘違いしてました。
DrawRectGraphだけダメなようです。DrawGraphではマスク表示されます。
これは、DXLIBのご本家の掲示板で質問していただくのが一番のようです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

chain

Re: DxLibのマスクとDrawRectGraph

#6

投稿記事 by chain » 10年前

ご回答ありがとうございました。
あちらの掲示板でスレッドを立てましたので、こちらでは
一応解決という形を取ろうかと思います。

続きや回答が気になった方は本家の掲示板の「マスク有効時のDrawRectGraph」というタイトルのスレを
ご覧ください。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る