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

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

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

#1

投稿記事 by カル » 12年前

画面上に表示するアイコンを、左下から徐々に描画していき、右上まで達したら左下からまた消していくというのをやりたいのですが
どうしたらいいでしょうか?

画像

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 12年前

どのような環境で動作させたいのでしょうか?
DXライブラリ?OpenGL?Java?iアプリ?GIFアニメ?HTML5?その他?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

カル

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

#3

投稿記事 by カル » 12年前

失礼しました、DXライブラリです。
予想ではマスク処理?をすれば出来そうな気がしなくもないんですが

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

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

#4

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

背景を部分的に上書きではだめでしょうか?

【補足】
マスク画像の方が簡単かもしれませんね。
「DXライブラリ置き場 リファレンスページ」
http://homepage2.nifty.com/natupaji/DxL ... html#R16N1
そんなに難しくないのでためしてみることをおすすめします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#5

投稿記事 by ISLe » 12年前

マスク画像を作るよりZバッファを利用するほうがメモリ消費量や速度において有利かもしれません。

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

カル

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

#6

投稿記事 by カル » 12年前

ありがとうございます
とりあえずマスク画像のほうを試そうと思うのですが、背景ごと消えてしまわないでしょうか?

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

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

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

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

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

#7

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

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

リファレンスに有る関数を片っ端に試したほうが早いので、試す癖は付けたほうが良いですよ。
爆発するわけじゃないし、PCも壊れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#8

投稿記事 by ISLe » 12年前

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: 斜線状に消えていくアイコン

#9

投稿記事 by カル » 12年前

サンプルコード組んでいただきありがとうございます。
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以下だと三角形が上書きされないのでしょうか?

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#10

投稿記事 by ISLe » 12年前

とりあえずSetUseZBufferFlagでTRUEを指定しないことにはZバッファが有効になりませんが大丈夫でしょうか。

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

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

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

カル

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

#11

投稿記事 by カル » 12年前

すいません
SetUseZBufferFlag(true);
と思って認識していたのが
SetUseZBuffer3D(true);
でした。

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

閉鎖

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