ページ 11

DXライブラリで指定した範囲をゲームの描画をウインドウ自体から消すマスク的な関数はあるのでしょうか?

Posted: 2016年1月18日(月) 00:46
by のん
恐れ入ります。わかりやすく画像も用意したのですが、
この掲示板で画像の貼り付け方がわからなかったので
うpろだに画像を用意しましたのでそちらを見ていただけるとうれしいです。

http://iup.2ch-library.com/i/i1584698-1453045329.jpg

画像については適当なデスクトップ画面の上からゲームを起動したときの様子を
フォトショップで加工したものです。
DXライブラリで作ったゲームと仮定して
このゲームの中の指定した範囲の描画を消してデスクトップ画面まで見えるようにできる
関数、もしくはやり方をご存知の方がいましたら教えていただけるとうれしいです。
よろしくお願いいたします。

Re: DXライブラリで指定した範囲をゲームの描画をウインドウ自体から消すマスク的な関数はあるのでしょうか?

Posted: 2016年1月18日(月) 10:16
by Ketty
こんにちは(^v^)

のんさんが期待されているような関数は、DXライブラリにはありません。
この範囲だけウィンドウ自体をくり抜く、ということはできません。

似たような効果が期待できる別の手段として、
私が思いつくのは、
透明なウィンドウで、デスクトップ全体を覆って、デスクトップの内容を映し出したい部分"以外"にゲームの画像を表示することです。

↓こんな感じで1~4をするとできますが・・・おすすめではありません。

1.ゲームのウィンドウを透過ウィンドウにして、

コード:

	DxLib::ChangeWindowMode( TRUE ) ;
	DxLib::SetUseBackBufferTransColorFlag( TRUE ) ;
2.デスクトップ全領域(全面積)をそのウィンドウで覆って、

コード:

	DxLib::SetWindowSizeChangeEnableFlag( FALSE, FALSE ) ;
	DxLib::SetWindowSize( ディスプレイ横幅, ディスプレイ縦幅 ) ;
	DxLib::DxLib_Init();

	int transSoft = DxLib::MakeARGB8ColorSoftImage( ディスプレイ横幅, ディスプレイ縦幅 ) ;
3.デスクトップ内容を映し出したい部分"以外"にゲームの画像を貼りつけて、

コード:

	DxLib::DrawGraph( デスクトップ"以外"の場所X, デスクトップ"以外"の場所Y ) ;
4.毎フレーム、ウィンドウの内容を更新する

コード:

	DxLib::GetDrawScreenSoftImage( 0, 0, ディスプレイ横幅, ディスプレイ縦幅, transSoft ) ;
	DxLib::UpdateLayerdWindowForPremultipliedAlphaSoftImage( transSoft ) ;
しかし、このやり方にはデメリットがあり、
のんさんがいま考えておられるゲームの内容にマッチしない可能性があります。

【デメリット】
・ウィンドウを透明にするので、×ボタンや最大化ボタン、ウィンドウ枠が無くなります。
・デスクトップ全体を描画対象にするのでディスプレイが大きければ大きいほど負荷がかかります。
・透明ウィンドウの毎フレーム更新は負荷がかかるので、FPSを低め(10、15、20くらい)にすることを検討する必要があります。
・ゲーム画像も透明や半透明(透過PNGなど)であるときは乗算済みアルファの概念などを勉強・理解する必要があります。
・ゲームプログラムとしては一般的ではないので、今後の開発で行き詰まっても相談できる人が少なそうに思います。

Re: DXライブラリで指定した範囲をゲームの描画をウインドウ自体から消すマスク的な関数はあるのでしょうか?

Posted: 2016年1月18日(月) 23:53
by みけCAT
のん さんが書きました:この掲示板で画像の貼り付け方がわからなかったので
ユーザー登録すると、「ファイル添付」から画像を上げて「インライン表示」で貼ることができます。
のん さんが書きました:うpろだに画像を用意しましたのでそちらを見ていただけるとうれしいです。

http://iup.2ch-library.com/i/i1584698-1453045329.jpg
Not Foundになっていますね。
こんなこともあろうかと、WebArchiveに入れておきました。