ページ 11

斜線状に消えていくアイコン

Posted: 2013年11月03日(日) 00:17
by カル
画面上に表示するアイコンを、左下から徐々に描画していき、右上まで達したら左下からまた消していくというのをやりたいのですが
どうしたらいいでしょうか?

画像

Re: 斜線状に消えていくアイコン

Posted: 2013年11月03日(日) 00:27
by みけCAT
どのような環境で動作させたいのでしょうか?
DXライブラリ?OpenGL?Java?iアプリ?GIFアニメ?HTML5?その他?

Re: 斜線状に消えていくアイコン

Posted: 2013年11月03日(日) 09:05
by カル
失礼しました、DXライブラリです。
予想ではマスク処理?をすれば出来そうな気がしなくもないんですが

Re: 斜線状に消えていくアイコン

Posted: 2013年11月03日(日) 10:51
by softya(ソフト屋)
背景を部分的に上書きではだめでしょうか?

【補足】
マスク画像の方が簡単かもしれませんね。
「DXライブラリ置き場 リファレンスページ」
http://homepage2.nifty.com/natupaji/DxL ... html#R16N1
そんなに難しくないのでためしてみることをおすすめします。

Re: 斜線状に消えていくアイコン

Posted: 2013年11月03日(日) 15:24
by ISLe
マスク画像を作るよりZバッファを利用するほうがメモリ消費量や速度において有利かもしれません。

参考:ゲーム中の半透明ウィンドウ表示について

Re: 斜線状に消えていくアイコン

Posted: 2013年11月04日(月) 16:01
by カル
ありがとうございます
とりあえずマスク画像のほうを試そうと思うのですが、背景ごと消えてしまわないでしょうか?

マスク画像が200*100で、それを画面上にDrawMask()した時、その部分だけ黒くぽっかり描画されないような気がするんですがどうしたらいいでしょうか

マスクしてほしいのは現在DrawLineとDrawFormatStringToHandleで描画されているところだけです。

マスクを架空の画面で適用した後、それを改めて画面に描画するというのを想定してるのですが、リファレンスにはそこらへんが書いてなくて・・

Re: 斜線状に消えていくアイコン

Posted: 2013年11月04日(月) 16:33
by softya(ソフト屋)
SetUseMaskScreenFlagで有効/無効にできるので
SetUseMaskScreenFlag(FALSE);//マスク無効
背景darw
SetUseMaskScreenFlag(TRUE);//マスク有効
FillMaskScreen(1);//マスクのクリア
DrawMask()
欠けてほしいものdraw
SetUseMaskScreenFlag(FALSE);//マスク無効
その他のdraw
の順番で良いはずです。
リファレンスのマスク関係を丹念に読んでみて下さい。
ただ、あまり私は使わないので間違っているかもしれません。

リファレンスに有る関数を片っ端に試したほうが早いので、試す癖は付けたほうが良いですよ。
爆発するわけじゃないし、PCも壊れません。

Re: 斜線状に消えていくアイコン

Posted: 2013年11月04日(月) 17:27
by ISLe
DXライブラリの描画関数をふつうに使えるのでZバッファを利用するほうが楽だと思いますが。

コード:

#include "DxLib.h"
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);
	if (DxLib_Init() != 0) return 0;
	SetDrawScreen(DX_SCREEN_BACK);

	int maskX = 0;

	// Zバッファを使う準備
	SetUseZBufferFlag(TRUE);
	SetZBufferCmpType(DX_ZCMP_DEFAULT);

	while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0) {
		for (int i=0; i<8; i++) {
			DrawBox(0, i*60, 640, i*60+60, GetColor((i&2)?192:0, (i&4)?192:0, (i&1)?192:0), TRUE);
		}

		// マスク部分をZバッファに反映させる準備
		ClearDrawScreenZBuffer();
		SetWriteZBufferFlag(TRUE);
		SetDrawZ(0.2f);

		// マスク部分を描画
		SetDrawBlendMode(DX_BLENDMODE_ALPHA, 0); // 透明にする
		DrawTriangle(maskX, 0, maskX+240, 480, maskX, 480, GetColor(255,0,0), TRUE);
		DrawTriangle(maskX-240, 0, maskX, 0, maskX, 480, GetColor(255,0,0), TRUE);
		SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
		maskX += 4;
		if (maskX > 640) { maskX -= 640; }

		SetWriteZBufferFlag(FALSE); // Zバッファを更新するのはマスクだけで良い
		SetDrawZ(0.3f);

		DrawCircle(640/2, 480/2, 480/3, GetColor(255,255,255), TRUE);
	}
	
	DxLib_End();
	return 0;
}

Re: 斜線状に消えていくアイコン

Posted: 2013年11月04日(月) 19:11
by カル
サンプルコード組んでいただきありがとうございます。
ISLeさんのを試してみましたが、普通に表示され、消えたりしません。
プロジェクトを新しく作ってそのままコピペすると、しっかりスクロールされていくのですが・・・

コード:

	for(size_t i=0 ; i < ObjectList.size() ; i++){
		VECTOR ScreenPos = ConvWorldPosToScreenPos(ObjectList[i]->GetPosition());
		if(0.0f < ScreenPos.z && ScreenPos.z < 1.0f){
			if(0.0f< ScreenPos.x && ScreenPos.x < WindowControl->GetXWindowSize()){
				if(0.0f< ScreenPos.y && ScreenPos.y < WindowControl->GetYWindowSize()){

					// マスク部分をZバッファに反映させる準備
					ClearDrawScreenZBuffer();
					SetWriteZBufferFlag(TRUE);
 
					// マスク部分を描画
					SetDrawBlendMode(DX_BLENDMODE_ALPHA, 0); // 透明にする
					DrawTriangle(ScreenPos.x+maskX		, ScreenPos.y, ScreenPos.x+maskX+240, ScreenPos.y+30, ScreenPos.x+maskX, ScreenPos.y+200, GetColor(255,0,0), TRUE);
					DrawTriangle(ScreenPos.x+maskX-240	, ScreenPos.y, ScreenPos.x+maskX	, ScreenPos.y	, ScreenPos.x+maskX, ScreenPos.y+200, GetColor(255,0,0), TRUE);
					SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
					maskX += 4;
					if (maskX > 640) {  -= 640; }

					SetWriteZBufferFlag(FALSE); // Zバッファを更新するのはマスクだけで良い
					SetDrawZ(0.3f);
						DrawFormatString(ScreenPos.x,ScreenPos.y,CursorColor[Force],ObjectList[i]->GetName().c_str());
					SetDrawZ(0.2f);
				}
			}
		}
	}
ObjectListはワールド中の全てのObjectで、ScreenPosというのは画面上の座標です。
画面内にあったら名前を3~4秒だけ表示する、というのが最終目標です。
カメラはSetCameraNearFar( 10.0f,41000.0f );と設定してあるのですが、10.0f以下だと三角形が上書きされないのでしょうか?

Re: 斜線状に消えていくアイコン

Posted: 2013年11月04日(月) 22:51
by ISLe
とりあえずSetUseZBufferFlagでTRUEを指定しないことにはZバッファが有効になりませんが大丈夫でしょうか。

SetDrawZは、それ以降に描画されるピクセルに対してZバッファに書き込まれる値を指定します。
ですからSetDrawZ関数を呼び出す順番が異なれば結果も異なります。
サンプルコードをよく見てください。
0.2fのとき描画したものは0.3fで描画するものより優先されます(DX_ZCMP_DEFAULTの場合)。
だから既に(透明で)描いたところには描画されないというわけです。

Zバッファをいったんクリアしてしまうので3D描画と平行して行うことはできません。
2D描画は3D描画の後にまとめて行ってください。
カメラは関係ありません。

デバッグ中はマスクを透明にするためのSetDrawBlendModeをコメントアウトするか値を増やすとよいでしょう。
どの部分を隠しているのかはっきり見ることができます。

Re: 斜線状に消えていくアイコン

Posted: 2013年11月04日(月) 23:33
by カル
すいません
SetUseZBufferFlag(true);
と思って認識していたのが
SetUseZBuffer3D(true);
でした。

適用してみたところしっかりと期待値どおりになりました。
ありがとうございます