境界線付近の描画について
境界線付近の描画について
いつもお世話になっております。シエルです。
今シューティングゲームを作成中なのですが、
ゲームメイン画面とボード等がある画面との境目の描画方法について困っています。
どの部分か分からないと思うので、龍神録を例にした添付画像をごらん下さい。
何が困っているかと言いますと、
ゲームメイン画面で描画された弾などは、ボード画面との境目付近で綺麗に消えてくれます。
一方、ボード画面で描画された紅葉のエフェクトも境目付近で綺麗に消えます。
このお互いが境目付近で綺麗に消えてくれる方法が分かりません。
具体的に申しますと、
ゲームメイン画面で弾を描画
↓
ボード画面を描画
の順に描画すれば、弾はボード画面によって上書きされ、弾は境目付近で綺麗に消えてくれます。
ですがこの状態だと、ボード画面に描画される右から左に移動するエフェクトはゲームメイン画面に
まで一部侵攻して描画されてしまいます。
逆に上記の描画順序を逆にしても、弾がボード画面に一部侵攻してしまいます。
お互いの画面で描画するオブジェクトをうまく境目付近で綺麗に消す方法はどのようにすればよいでしょうか?
お忙しいところ申し訳ございませんが、よろしくお願い致します。
今シューティングゲームを作成中なのですが、
ゲームメイン画面とボード等がある画面との境目の描画方法について困っています。
どの部分か分からないと思うので、龍神録を例にした添付画像をごらん下さい。
何が困っているかと言いますと、
ゲームメイン画面で描画された弾などは、ボード画面との境目付近で綺麗に消えてくれます。
一方、ボード画面で描画された紅葉のエフェクトも境目付近で綺麗に消えます。
このお互いが境目付近で綺麗に消えてくれる方法が分かりません。
具体的に申しますと、
ゲームメイン画面で弾を描画
↓
ボード画面を描画
の順に描画すれば、弾はボード画面によって上書きされ、弾は境目付近で綺麗に消えてくれます。
ですがこの状態だと、ボード画面に描画される右から左に移動するエフェクトはゲームメイン画面に
まで一部侵攻して描画されてしまいます。
逆に上記の描画順序を逆にしても、弾がボード画面に一部侵攻してしまいます。
お互いの画面で描画するオブジェクトをうまく境目付近で綺麗に消す方法はどのようにすればよいでしょうか?
お忙しいところ申し訳ございませんが、よろしくお願い致します。
Re:境界線付近の描画について
DXライブラリであれば、描画範囲を指定する関数がありますが、参考になりますでしょうか?
http://homepage2.nifty.com/natupaji/DxL ... .html#R4N3
http://homepage2.nifty.com/natupaji/DxL ... .html#R4N3
Re:境界線付近の描画について
シエルさんは確かDirectXでゲームを作成しているんでしたっけ・・
DXライブラリならば(龍神録でいうならば)
SetDrawArea( FX, FY, FX+FMX, FY+FMY);
で境界を作ることができます。参考までにどうぞ。
DXライブラリならば(龍神録でいうならば)
SetDrawArea( FX, FY, FX+FMX, FY+FMY);
で境界を作ることができます。参考までにどうぞ。
Re:境界線付近の描画について
DirectXはさっぱり分かりませんが、SelectClipRgn()等は使えませんか
追記です。
グーグル先生に聞いたところ、クリッピング処理を専門に行うIDirectDrawClipperというインターフェイスがあるそうです。
しかしとても遅いので、自前で実装しました。 と下記のサイトに説明があります。
http://hp.vector.co.jp/authors/VA012320/directx4.html

追記です。
グーグル先生に聞いたところ、クリッピング処理を専門に行うIDirectDrawClipperというインターフェイスがあるそうです。
しかしとても遅いので、自前で実装しました。 と下記のサイトに説明があります。
http://hp.vector.co.jp/authors/VA012320/directx4.html

Re:境界線付近の描画について
>>へろりさん
ありがとうございます。
SelectClipRgn試しました。が、DirectXでの描画には効果が無かったです。勉強になりました。
>グーグル先生に聞いたところ、クリッピング処理を専門に行うIDirectDrawClipperというインターフェイスがあ
>るそうです。
>しかしとても遅いので、自前で実装しました。 と下記のサイトに説明があります。
このページの解説はDirectDrawでの方法のようです。これはDirectX7ぐらいでのバージョンの話になるようです。
私はDirectX9で開発しています。
Directx9はDirectDrawは廃止されてしまっています。
>>ぬるぽさん、ookamiさん
DXライブラリの本家ページにあった、DXライブラリのライブラリ自体を落っことしてきて、
setdrawarea関数のソースを見ました。
どうやらビューポートの設定を変えて描画領域を指定しているようでした。
ですが、ビューポートに関してはまだ詳しくないので、できるかわかりませんが、調べてやってみます。
皆さんの回答を見るまでは描画領域を指定して描画するという発想が頭が固いせいか、出てこなかったので
非常に参考になりました。
それで思いついた方法として、ボードの描画先のレンダリングターゲットを変更して、
大きさを指定したテクスチャに描画するようにし、最後にバックバッファに描画する方法が思いつきました。
一回どちらかの方法でやってみて、無理そうならまた考えます。
なので、一旦解決にしておきます。
ありがとうございました!
まだ他に良い方法を知ってる方がいらっしゃったら、回答お願い致します!
ありがとうございます。
SelectClipRgn試しました。が、DirectXでの描画には効果が無かったです。勉強になりました。
>グーグル先生に聞いたところ、クリッピング処理を専門に行うIDirectDrawClipperというインターフェイスがあ
>るそうです。
>しかしとても遅いので、自前で実装しました。 と下記のサイトに説明があります。
このページの解説はDirectDrawでの方法のようです。これはDirectX7ぐらいでのバージョンの話になるようです。
私はDirectX9で開発しています。
Directx9はDirectDrawは廃止されてしまっています。
>>ぬるぽさん、ookamiさん
DXライブラリの本家ページにあった、DXライブラリのライブラリ自体を落っことしてきて、
setdrawarea関数のソースを見ました。
どうやらビューポートの設定を変えて描画領域を指定しているようでした。
ですが、ビューポートに関してはまだ詳しくないので、できるかわかりませんが、調べてやってみます。
皆さんの回答を見るまでは描画領域を指定して描画するという発想が頭が固いせいか、出てこなかったので
非常に参考になりました。
それで思いついた方法として、ボードの描画先のレンダリングターゲットを変更して、
大きさを指定したテクスチャに描画するようにし、最後にバックバッファに描画する方法が思いつきました。
一回どちらかの方法でやってみて、無理そうならまた考えます。
なので、一旦解決にしておきます。
ありがとうございました!
まだ他に良い方法を知ってる方がいらっしゃったら、回答お願い致します!
Re:境界線付近の描画について
>>シエルさん
管理人さんが描画範囲を指定して描画しているのかはわからないですが
簡単な方法でいいのであれば、DirectX ではなく
画像と描画の順番を変えるだけで出来るかもしれません。
例えば件の紅葉ですが、添付画像では画面下の方で紅葉が切れているので
キャラを動かせる範囲の部分をボードから切り取り、
画面下の狭い隙間に紅葉が隠せるように何か描画しているような感じに見えました。
紅葉が切れている部分(赤丸の部分)をよく見てみると
1px 程ズレてるように見えたのでそうではないかなという意見でした。
管理人さんが描画範囲を指定して描画しているのかはわからないですが
簡単な方法でいいのであれば、DirectX ではなく
画像と描画の順番を変えるだけで出来るかもしれません。
例えば件の紅葉ですが、添付画像では画面下の方で紅葉が切れているので
キャラを動かせる範囲の部分をボードから切り取り、
画面下の狭い隙間に紅葉が隠せるように何か描画しているような感じに見えました。
紅葉が切れている部分(赤丸の部分)をよく見てみると
1px 程ズレてるように見えたのでそうではないかなという意見でした。
Re:境界線付近の描画について
>DVDMさん
ええと、私の理解不足で描画順番がいまいちわからないのですが、
現状は
①弾を描画
②ボードを描画
の順にすると、ボード画面の紅葉がはみ出してしまい、
上記を逆にすると、弾がボードにはみ出てしまう状態です。
分かりやすく描画の順番を説明していただけると助かります。。
ええと、私の理解不足で描画順番がいまいちわからないのですが、
現状は
①弾を描画
②ボードを描画
の順にすると、ボード画面の紅葉がはみ出してしまい、
上記を逆にすると、弾がボードにはみ出てしまう状態です。
分かりやすく描画の順番を説明していただけると助かります。。
Re:境界線付近の描画について
>>シエルさん
うぅ…実装してみようと思いやってきましたが
描画順番を変えただけでは解決できそうになかったです…。
理解不足はこちらの方でした;
申し訳ございません!
DirectX の関数ですが IDirect3DDevice9::SetViewport は駄目ですかね…。
D3DVIEWPORT9 ViewPort;
ViewPort.X = 0;
ViewPort.Y = 0;
ViewPort.Width = 100;
ViewPort.Height = 200;
ViewPort.MinZ = 0.0f;
ViewPort.MaxZ = 1.0f;(修正箇所)
デバイス->SetViewport(&ViewPort);
左上から100*200の範囲で描画できますが、こういうのではないんですよね;
うぅ…実装してみようと思いやってきましたが
描画順番を変えただけでは解決できそうになかったです…。
理解不足はこちらの方でした;
申し訳ございません!
DirectX の関数ですが IDirect3DDevice9::SetViewport は駄目ですかね…。
D3DVIEWPORT9 ViewPort;
ViewPort.X = 0;
ViewPort.Y = 0;
ViewPort.Width = 100;
ViewPort.Height = 200;
ViewPort.MinZ = 0.0f;
ViewPort.MaxZ = 1.0f;(修正箇所)
デバイス->SetViewport(&ViewPort);
左上から100*200の範囲で描画できますが、こういうのではないんですよね;

Re:境界線付近の描画について
>DVDMさん
ありがとうございます!まさにこれを求めてました!
これで指定した範囲だけ描画することができるようになりました!
非常に助かりました!
これにて完全解決とさせていただきます!
ありがとうございます!まさにこれを求めてました!
これで指定した範囲だけ描画することができるようになりました!
非常に助かりました!
これにて完全解決とさせていただきます!
Re:境界線付近の描画について
解決されてしまったようですが、別の方法ということで…
参考までにどうぞ
↓ステンシルバッファを使ってクリップ処理をする方法みたいです
http://marupeke296.com/DXG_No54_StencilClipping.html
参考までにどうぞ
↓ステンシルバッファを使ってクリップ処理をする方法みたいです
http://marupeke296.com/DXG_No54_StencilClipping.html