複雑な形の 範囲指定 と 表示

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

複雑な形の 範囲指定 と 表示

#1

投稿記事 by ユナ » 9年前

DXライブラリで

RECT演算子を使えば正方形の範囲指定する事が出来るのはわかるのですが、複雑な形の範囲を指定するはどうすればいいのでしょうか?

例えば下のような形で■の 部分のみ選択範囲とする場合 ですね

□□□□□□
□□■■□□
■■■■■■
■■■■■■
□□■■□□
■■□□■■

あと、■ の部分と □ の部分でまったく別の絵を表示するにはどうしたらいいでしょうか?

ユナ

Re: 複雑な形の 範囲指定 と 表示

#2

投稿記事 by ユナ » 9年前

申し訳ない
正方形ではなく四角形でした

後演算子ではなく構造体でした

ユナ

Re: 複雑な形の 範囲指定 と 表示

#3

投稿記事 by ユナ » 9年前

えっと背景とキャラクターの絵を同時に表示する場合は
まず背景を描画し、次に透明色があるキャラクターの絵を描画すればいいのはわかるのですが

そういうのではなく、切り抜いた箇所を表示したいのですよね
ペイントソフトでの手順で言うなら

2枚の絵ABと切り抜く場所の絵を用意する

切り抜く絵を、切り抜きたい部分を透明にして、絵Aと重ね合わせて切り抜き部分を浮かび上がらせて、絵を保存

次にその絵の余りの部分を透明色にして絵Bと重ね合わせて絵を保存する

と言う方法でならペイントソフト上では出来るのですが、これをプログラム上で行いつつ なおかつ なおかつ新しい絵は作らないプログラムを作りたいのですね

なので切り抜きたい絵の部分を2色に分けて(例えば黒と白にする)絵を読み込んだ時、黒の部分は判定をありにして、絵Aを描画、白の部分を判定なし、絵Bを描画する

と言う方法ではないかと疑っているのですが
その場合、どうプログラムを書いたらいいのかがわかりません

ろん
記事: 18
登録日時: 14年前

Re: 複雑な形の 範囲指定 と 表示

#4

投稿記事 by ろん » 9年前

コード:

 
#include "DxLib.h"

const int ScreenW = 640;
const int ScreenH = 480;

int color;
int rect[4][4]{
	{100, 200, 400, 300},
	{200, 100, 300, 400},
	{ 50, 420, 100, 470},
	{450, 420 ,500, 470}
};
unsigned char MaskData[480][640];
int MaskHandle;

int WINAPI WinMain(HINSTANCE h1, HINSTANCE hP, LPSTR lpC, int nC){
	ChangeWindowMode(TRUE);
	SetGraphMode(ScreenW, ScreenH, 32);
	SetDrawScreen(DX_SCREEN_BACK);
	if (DxLib_Init()) return false;

	while (ProcessMessage() == 0){
		ClearDrawScreen();

		//水色でクライアント領域640*480を塗りつぶし
		color = GetColor(0, 255, 255);
		DrawBox(0, 0, ScreenW, ScreenH, color, TRUE);

		//マスク画面作成
		CreateMaskScreen();
		
		MaskHandle = MakeMask(ScreenW, ScreenH);

		for (int i = 0; i < 4; i++){
			for (int j = rect[i][0]; j < rect[i][2]; j++){
				for (int k = rect[i][1]; k < rect[i][3]; k++){
					MaskData[k][j] = 0xff;
				}
			}
		}

		SetDataToMask(ScreenW, ScreenH, MaskData, MaskHandle);
		DrawFillMask(0, 0, ScreenW, ScreenH, MaskHandle);

		//黄色でクライアント領域640*480へ塗りつぶし命令
		DrawBox(0, 0, ScreenW, ScreenH, 0xffff00, TRUE);

		DeleteMask(MaskHandle);
		DeleteMaskScreen();

		ScreenFlip();
	}
	DxLib_End();
	return 0;
}
構造体ではなく配列でやりましたが、ユナさんのやりたい事って多分こんな感じでしょうか?
Dxライブラリ、関数リファレンスページのマスク関係関数を見られるといいと思います。

SetDataToMask関数だけでなく、DrawFillMaskまでやらないとマスク画面まで反映されないとか、自分も勉強になりました。

ユナ

Re: 複雑な形の 範囲指定 と 表示

#5

投稿記事 by ユナ » 8年前

あれから負傷してしばらくこれませんでした。

マスクの概念を理解したので表示する事は簡単にできるようになりました

コード:

 
	MaskHandle = LoadMask( "mk.png" ) ;
	a = LoadGraph ( "m_5.png" );
	b = LoadGraph ( "m_1.png" );

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
		CreateMaskScreen() ;
		DrawGraph( 0 , 0 , b , false );
		DrawMask( 0 , 0 , MaskHandle , DX_MASKTRANS_BLACK ) ;
		DrawGraph( 0 , 0 , a , false );
		DeleteMaskScreen() ;
	}


判定の方ですがこちらを参考にすればよさそうなのですがマスク画像(黒と白の点で作った画像)は作れました
http://dixq.net/forum/viewtopic.php?f=3&t=17135
そこまでは理解できたのですが

・マスク画像全体を0で初期化とかかれている部分から良く分からないのですが、マスク画像を読み込んだらすでにそのドットが黒か白かが入れてあるのではないのですか?

それを何故0で初期化する必要性があるのでしょうか?

ユナ

Re: 複雑な形の 範囲指定 と 表示

#6

投稿記事 by ユナ » 8年前

後、思ったのですがマスクの概念を理解してからいくつかのパターンのマスクを作ったのですが、
これって何箇所も処理したら重くなるんですよね

だとすると

一・マスク処理して出来た画像をどこかに保存しておいて、使用したいパターンの画像を使う方法
最初に全ての画像パターンをデーターとして所得するため処理速度は遅くなる?

ニ・マスクを使用してパターンを製作する方法
マスク処理自体が重くなるため処理速度は遅くなる

の二つの方法で画像を表示できると思うのですが、手法としては一のほうが処理速度は速かったりしますか?

ユナ

Re: 複雑な形の 範囲指定 と 表示

#7

投稿記事 by ユナ » 8年前

コード:

	int MaskHandle;
	int a , b , c;
	int hantei;
	int MouX , MouY;

	MaskHandle = LoadMask( "mk.png" ) ;
	a = LoadGraph ( "m_5.png" );
	b = LoadGraph ( "m_1.png" );
	c = LoadGraph ( "mk.png" ); //これは今回マスク画像をそのまま使ったけど色分けした画像を使えば分けた数の分だけあれこれ指定できる

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

		GetMousePoint( &MouX , &MouY );
		POINT pt = { MouX , MouY };

		DrawGraph( 0 , 0 , c , false );
		hantei = GetPixel( MouX , MouY );

		CreateMaskScreen();
		DrawGraph( 0 , 0 , b , false );
		DrawMask( 0 , 0 , MaskHandle , DX_MASKTRANS_BLACK );
		DrawGraph( 0 , 0 , a , false );
		DeleteMaskScreen();

		DrawFormatString( 100 , 100 , GetColor( 255 , 255 , 255 ) , "%d %d" , MouX , MouY );
		DrawFormatString( 100 , 140 , GetColor( 255 , 255 , 255 ) , "%d" , hantei );

		switch( hantei ){
			case 0: //黒色なら
				break;

			case 1677215: //白色なら
				break;

			//用途に合わせて他の色も追加していく
		}
	}


判定できるようになりました
画素値について調べればよかったんですね

ユナ

Re: 複雑な形の 範囲指定 と 表示

#8

投稿記事 by ユナ » 8年前

これで
・キャラクターのシルエットにカーソルを持っていくとキャラクターが浮かび上がる
・装備等のアイテムの一部を色違いに出来る
等が出来るようになりました

マスクと画素値について教えてくださりありがとうございました

閉鎖

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