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

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

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

#1

投稿記事 by Thanmz » 12年前

自分で定義した半透明ウィンドウ同士を重ねる時、重なった部分においては奥にある(先に描画した)ウィンドウを見えなくする処理を考えています。最近のドラクエのウィンドウみたいな処理のことです。

2Dゲームでは元々のゲーム画面を各ウィンドウの矩形に合わせて描画すれば目的は達成できましたが、
3DゲームではZバッファのため?上記の方法ではうまくきません。

なにか定石のようなものがあるのでしょうか?

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

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

#2

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

申し訳ないのですが最近のドラクエのウィンドウが分からないのですが、どこかに画像はありませんでしょうか?
あと、どのようにして3Dで重ねようとしたのかを教えていただけると回答しやすくなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

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

#3

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

画像を見つけましたが、奥のウィンドウの色が濃くなっているだけに見えます。
「ドラゴンクエスト10 オンライン 目覚めし五つの種族 プレイ日記その8 HIKO's memo」
http://precurefight.blog77.fc2.com/blog-entry-2059.html
最初の会話画面で「会話」と「はい/いいえ」でウィンドウの色が違います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

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

#4

投稿記事 by ISLe » 12年前

最近のドラクエではないですが、例えばスーパーファミコンの半透明機能で最前面しか反映されないのはハードウェアの制限です。
PCで再現するなら該当ハードの描画機能をエミュレーションするコードを書く必要があるでしょう。

3DでZバッファを使っているのなら手前から描画すれば良いだけな気がしますが。
半透明は奥から描かないと消えてしまう問題の逆ですよね。

Thanmz

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

#5

投稿記事 by Thanmz » 12年前

こんな感じです↓。
http://blog-imgs-51.fc2.com/g/u/s/gussa ... 014807.jpg
試した方法は↓です。

コード:

[code/]
Window::draw() {
  SetDrawArea( ウィンドウの矩形 ) ;
  MV1DrawModel( 天球モデル ) ;
  MV1DrawModel( 地形モデル ) ;
  MV1DrawModel( キャラクターモデル ) ;
  SetDrawArea( 画面全体 ) ;  
}
[/code]
2Dの場合はモデル描画のところをDrawGraph()でフィールド画面を描画することで目的を達成できました。
3Dだとウィンドウが背景より奥?に表示されるというか。DXライブラリのリファレンスを見ると、
MV1DrawModel()はZバッファを使用しているから奥から描画しないと不具合が生じるとのことでした。
確かに、上の方法だと初めにフィールド画面の描画をした後に各々のwindow::draw()を行うため
Zバッファを全く考慮していないのだろうとは思いました。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

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

#6

投稿記事 by h2so5 » 12年前

2Dと3D部分を同時に描画しようとすると面倒なので、オフスクリーンレンダリングを利用すると便利かと思います。
MakeScreenで生成した画面に2Dのメニューのウィンドウを描画しておき、あとで3Dの画面上に合成します。

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

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

#7

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

h2so5さんの方法で、とりあえずウィンドウは前面に描画できると思います。
あと、どうしても最前面の後ろの背景透過をシミュレートしたいかどうかですね。
やったことは無いですが、最後に書いたものを透過するはたぶん出来ると思います。 ※試してないので断言出来ませんが。
最近のドラクエでもやっていなので、やる必要があるかどうかはご検討ください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

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

#8

投稿記事 by ISLe » 12年前

ちょっと状況が見えないんですけど。
ウィンドウ同士では奥のウィンドウを見えなくする処理はできているということでしょうか。
そうでないとオフスクリーンを使っても同じことなのでは。

2Dでも3DでもSetDrawAreaって必要ですかね。

ウィンドウの描画にどんな関数を使っているのかがかなり重要ですけど。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

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

#9

投稿記事 by h2so5 » 12年前

おそらく、背景を描画した後にウィンドウを描画して、ウィンドウ同士が重なる領域にもう一度背景を描画し、
その上にもう一つのウィンドウを描画することで再現しているということではないでしょうか。

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

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

#10

投稿記事 by ISLe » 12年前

ウィンドウの数だけウィンドウの内側を描画し直すということですか。

一回の描画でできるはずだと思ってDXライブラリの関数を調べたらなんとかできました。

DXライブラリのサイトの3Dアクション基本 サンプルプログラムで実験しました。
WinMain関数のメインループにあるScreenFlip()の直前に

コード:

		{
			SetUseZBufferFlag(TRUE);
			SetWriteZBufferFlag(TRUE);
			SetZBufferCmpType(DX_ZCMP_DEFAULT);
			ClearDrawScreenZBuffer();
			SetDrawZ(0.2f);
			SetDrawBlendMode(DX_BLENDMODE_ALPHA, 200);
			DrawBox(260,  40, 380, 440, GetColor( 64,  64,  64), TRUE);
			SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
			DrawBox(260,  40, 380, 440, GetColor(255, 255, 255), FALSE);
			SetDrawZ(0.3f);
			SetDrawBlendMode(DX_BLENDMODE_ALPHA, 200);
			DrawBox( 40, 200, 600, 280, GetColor( 64,  64,  64), TRUE);
			SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
			DrawBox( 40, 200, 600, 280, GetColor(255, 255, 255), FALSE);
		}
というコードを貼り付けると以下の画面になります。
PriSc001.png
横長の長方形はひとつの繋がったものですが、縦長の長方形に重なった部分は描画されていません。

同様に、SetDrawZで書き込むZ値を増やしながら手前のウィンドウから描画すれば、奥のウィンドウの重なる部分は描画されなくなります。

Thanmz

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

#11

投稿記事 by Thanmz » 12年前

皆さん回答ありがとうございます!

説明が下手で申し訳ありませんでしたが、h2so5さんの仰るとおりの方法で再現しておりました。
ISLeさんの方法を早速試させて頂きます!

Thanmz

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

#12

投稿記事 by Thanmz » 12年前

ISLeさんの方法で目的を達成できました!
こんなスマートなやり方があったとは、かなり感動しています。
返信してくださった皆様、ありがとうございました!

閉鎖

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