ページ 1 / 1
ゲーム中の半透明ウィンドウ表示について
Posted: 2013年8月05日(月) 00:25
by Thanmz
自分で定義した半透明ウィンドウ同士を重ねる時、重なった部分においては奥にある(先に描画した)ウィンドウを見えなくする処理を考えています。最近のドラクエのウィンドウみたいな処理のことです。
2Dゲームでは元々のゲーム画面を各ウィンドウの矩形に合わせて描画すれば目的は達成できましたが、
3DゲームではZバッファのため?上記の方法ではうまくきません。
なにか定石のようなものがあるのでしょうか?
Re: ゲーム中の半透明ウィンドウ表示について
Posted: 2013年8月05日(月) 00:37
by softya(ソフト屋)
申し訳ないのですが最近のドラクエのウィンドウが分からないのですが、どこかに画像はありませんでしょうか?
あと、どのようにして3Dで重ねようとしたのかを教えていただけると回答しやすくなります。
Re: ゲーム中の半透明ウィンドウ表示について
Posted: 2013年8月05日(月) 00:46
by softya(ソフト屋)
画像を見つけましたが、奥のウィンドウの色が濃くなっているだけに見えます。
「ドラゴンクエスト10 オンライン 目覚めし五つの種族 プレイ日記その8 HIKO's memo」
http://precurefight.blog77.fc2.com/blog-entry-2059.html
最初の会話画面で「会話」と「はい/いいえ」でウィンドウの色が違います。
Re: ゲーム中の半透明ウィンドウ表示について
Posted: 2013年8月05日(月) 01:13
by ISLe
最近のドラクエではないですが、例えばスーパーファミコンの半透明機能で最前面しか反映されないのはハードウェアの制限です。
PCで再現するなら該当ハードの描画機能をエミュレーションするコードを書く必要があるでしょう。
3DでZバッファを使っているのなら手前から描画すれば良いだけな気がしますが。
半透明は奥から描かないと消えてしまう問題の逆ですよね。
Re: ゲーム中の半透明ウィンドウ表示について
Posted: 2013年8月05日(月) 01:56
by Thanmz
こんな感じです↓。
http://blog-imgs-51.fc2.com/g/u/s/gussa ... 014807.jpg
試した方法は↓です。
Window::draw() {
SetDrawArea( ウィンドウの矩形 ) ;
MV1DrawModel( 天球モデル ) ;
MV1DrawModel( 地形モデル ) ;
MV1DrawModel( キャラクターモデル ) ;
SetDrawArea( 画面全体 ) ;
}
[/code]
2Dの場合はモデル描画のところをDrawGraph()でフィールド画面を描画することで目的を達成できました。
3Dだとウィンドウが背景より奥?に表示されるというか。DXライブラリのリファレンスを見ると、
MV1DrawModel()はZバッファを使用しているから奥から描画しないと不具合が生じるとのことでした。
確かに、上の方法だと初めにフィールド画面の描画をした後に各々のwindow::draw()を行うため
Zバッファを全く考慮していないのだろうとは思いました。
Re: ゲーム中の半透明ウィンドウ表示について
Posted: 2013年8月05日(月) 08:24
by h2so5
2Dと3D部分を同時に描画しようとすると面倒なので、オフスクリーンレンダリングを利用すると便利かと思います。
MakeScreenで生成した画面に2Dのメニューのウィンドウを描画しておき、あとで3Dの画面上に合成します。
Re: ゲーム中の半透明ウィンドウ表示について
Posted: 2013年8月05日(月) 10:20
by softya(ソフト屋)
h2so5さんの方法で、とりあえずウィンドウは前面に描画できると思います。
あと、どうしても最前面の後ろの背景透過をシミュレートしたいかどうかですね。
やったことは無いですが、最後に書いたものを透過するはたぶん出来ると思います。 ※試してないので断言出来ませんが。
最近のドラクエでもやっていなので、やる必要があるかどうかはご検討ください。
Re: ゲーム中の半透明ウィンドウ表示について
Posted: 2013年8月05日(月) 16:58
by ISLe
ちょっと状況が見えないんですけど。
ウィンドウ同士では奥のウィンドウを見えなくする処理はできているということでしょうか。
そうでないとオフスクリーンを使っても同じことなのでは。
2Dでも3DでもSetDrawAreaって必要ですかね。
ウィンドウの描画にどんな関数を使っているのかがかなり重要ですけど。
Re: ゲーム中の半透明ウィンドウ表示について
Posted: 2013年8月05日(月) 17:05
by h2so5
おそらく、背景を描画した後にウィンドウを描画して、ウィンドウ同士が重なる領域にもう一度背景を描画し、
その上にもう一つのウィンドウを描画することで再現しているということではないでしょうか。
Re: ゲーム中の半透明ウィンドウ表示について
Posted: 2013年8月05日(月) 23:31
by ISLe
ウィンドウの数だけウィンドウの内側を描画し直すということですか。
一回の描画でできるはずだと思って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);
}
というコードを貼り付けると以下の画面になります。
横長の長方形はひとつの繋がったものですが、縦長の長方形に重なった部分は描画されていません。
同様に、SetDrawZで書き込むZ値を増やしながら手前のウィンドウから描画すれば、奥のウィンドウの重なる部分は描画されなくなります。
Re: ゲーム中の半透明ウィンドウ表示について
Posted: 2013年8月06日(火) 20:25
by Thanmz
皆さん回答ありがとうございます!
説明が下手で申し訳ありませんでしたが、h2so5さんの仰るとおりの方法で再現しておりました。
ISLeさんの方法を早速試させて頂きます!
Re: ゲーム中の半透明ウィンドウ表示について
Posted: 2013年8月06日(火) 21:59
by Thanmz
ISLeさんの方法で目的を達成できました!
こんなスマートなやり方があったとは、かなり感動しています。
返信してくださった皆様、ありがとうございました!