トップページ > 記事閲覧
透過ウインドウについて
名前:Tir 日時: 2022/04/09 21:18

お世話になっております。今回ゲーム起動時に透過ウインドウにロゴを表示してからゲームを起動しようと思ったのですがDDS画像を使うと正常に表示されません。 また最初ロゴのサイズの解像度で透過ウインドウを起動したあと、ゲーム本来の解像度に変更する時に、一瞬変な風に描画されてしまいます。 黒い画面が表示されないようにSetWindowVisibleFlagを試したのですが効果が無くDxLib_Init()の前でしか効果は無いのでしょうか?どうすればスムーズに透過ウインドウと通常ウィンドウを切り替えられるでしょうか? #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int GrHandle, GrHandle2; int Screen; int SoftImage; int AlphaAdd; int Alpha; int Time=0; // ウインドウモードで起動 ChangeWindowMode(TRUE); //解像度変更時に画像をリセットしない SetChangeScreenModeGraphicsSystemResetFlag(FALSE); // 透過ウインドウ設定 SetUseBackBufferTransColorFlag(TRUE); SetGraphMode(1024, 192, 32);//ロゴサイズの解像度 // DXライブラリの初期化 if (DxLib_Init() < 0) return -1; SetWindowSizeExtendRate(1.0);//DPI解像度を通常に GrHandle2 = LoadGraph("screen.png"); //1280×960の画像 // 描画対象にできるアルファチャンネル付き画面を作成 Screen = MakeScreen(1024, 192, TRUE);//ロゴのサイズのスクリーン // 画面取り込み用のソフトウエア用画像を作成 SoftImage = MakeARGB8ColorSoftImage(1024, 192); // 画像を読み込む際にアルファ値をRGB値に乗算するように設定する SetUsePremulAlphaConvertLoad(TRUE); // 画像の読み込み GrHandle = LoadGraph("logo.png"); //1024×192の画像 // 描画先を描画対象にできるアルファチャンネル付き画面にする SetDrawScreen(Screen); // メインループ AlphaAdd = -8; Alpha = 255; while (ProcessMessage() == 0) { // 画面をクリア ClearDrawScreen(); // アルファ値の変更 Alpha += AlphaAdd; if (Alpha <= 0) { Alpha = 0; AlphaAdd = 8; } else if (Alpha >= 255) { Alpha = 255; AlphaAdd = -8; } // 描画ブレンドモードを乗算済みアルファにセット SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA, Alpha); // 画像を描画 DrawGraph(0, 0, GrHandle, TRUE); // 描画先の画像をソフトイメージに取得する GetDrawScreenSoftImage(0, 0, 1024, 192, SoftImage); // 取り込んだソフトイメージを使用して透過ウインドウの状態を更新する UpdateLayerdWindowForPremultipliedAlphaSoftImage(SoftImage); // 少し待つ Sleep(16); //カウントが120までロゴを表示 if (Time == 120) { break; } Time++; } DeleteGraph(Screen); DeleteSoftImage(SoftImage); SetGraphMode(1280, 960, 32); SetUseBackBufferTransColorFlag(FALSE); SetDrawScreen(DX_SCREEN_BACK); DeleteGraph(GrHandle); while (ProcessMessage() == 0&&CheckHitKey(KEY_INPUT_ESCAPE) == 0) { ClearDrawScreen(); SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255); DrawGraph(0, 0, GrHandle2, TRUE); ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }
メンテ

Page: 1 |

Re: 透過ウインドウについて ( No.1 )
名前:管理人 日時:2022/04/12 01:42

> 今回ゲーム起動時に透過ウインドウにロゴを表示してからゲームを起動しようと思ったのですがDDS画像を使うと正常に表示されません。 手元でDDS画像を使用してみた( 自作の logo.png を logo.dds に DirectX Texture Tool で変換して使用 )のですが、問題なく表示されました DDS画像は内部フォーマットが色々ありますが、試されたDDS画像のフォーマットは何でしたでしょうか? ( 手元で作成したDDS画像では A8R8G8B8 フォーマットで試しました ) > 黒い画面が表示されないようにSetWindowVisibleFlagを試したのですが効果が無くDxLib_Init()の前でしか効果は無いのでしょうか? すみません、SetWindowVisibleFlag( FALSE ); を実行していても SetGraphMode が実行されるとウィンドウが表示されるようになってしまっていました SetWindowVisibleFlag( FALSE ); を実行してウィンドウが非表示状態の場合は SetGraphMode を実行してもウィンドウが表示されないように 修正しましたので、よろしければこちらの修正版をお使いください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 上記のバージョンを使用していただいて、且つテストプログラムの後半部分を以下のようにしていただければ 黒い画面が表示されないようにできます // ウィンドウを非表示にするとアプリが非アクティブになってしまうので // 一時的に非アクティブでも動作するようにします SetAlwaysRunFlag( TRUE ) ; // ウィンドウを非表示にします SetWindowVisibleFlag( FALSE ) ; SetGraphMode(1280, 960, 32); SetUseBackBufferTransColorFlag(FALSE); SetDrawScreen(DX_SCREEN_BACK); DeleteGraph(GrHandle); bool VisibleFlag = false; while (ProcessMessage() == 0&&CheckHitKey(KEY_INPUT_ESCAPE) == 0) { ClearDrawScreen(); SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255); DrawGraph(0, 0, GrHandle2, TRUE); ScreenFlip(); // 最初のフレームの ScreenFlip 後に SetWindowVisibleFlag( TRUE ) でウィンドウを表示します if( VisibleFlag == false ) { VisibleFlag = true; SetWindowVisibleFlag( TRUE ) ; // 非アクティブでも実行する設定を解除します SetAlwaysRunFlag( FALSE ) ; } } よろしければお試しください m(_ _)m
メンテ
Re: 透過ウインドウについて ( No.2 )
名前:Tir 日時:2022/04/12 06:28

DDSはBC7で圧縮しております。念の為メールにて該当画像をお送りしました。 ウインドウの方は正常に黒い画像が表示されずに切り替えることが出来る事を確認しました
メンテ
Re: 透過ウインドウについて ( No.3 )
名前:管理人 日時:2022/04/13 02:14

> DDSはBC7で圧縮しております。念の為メールにて該当画像をお送りしました。 メール拝見しました、ありがとうございます すみません、SetUsePremulAlphaConvertLoad(TRUE); を実行した状態で LoadGraph を実行した場合は BC7 や DXT などで圧縮された 画像を通常の A8R8G8B8 フォーマットに変換して、その上で『乗算済みアルファ』の画像に変換しているのですが、 BC7 の圧縮形式には『圧縮画像を A8R8G8B8フォーマットに変換する』処理が対応していないので、正常ではない描画結果になってしまいます ( 正常に『乗算済みアルファ』の画像に変換できていないのに LoadGraph がエラーを返さないのはバグなので、後日修正しておきます ) お手数で申し訳ありませんが、SetUsePremulAlphaConvertLoad(TRUE); を実行して読み込む画像ファイルについては BC7 の圧縮形式のDDSファイルは使用しないようにしてください m(_ _;m ( 『圧縮画像を A8R8G8B8フォーマットに変換する』に対応している DDS形式は DXT1〜DXT5 となります )
メンテ
Re: 透過ウインドウについて ( No.4 )
名前:Tir(解決) 日時:2022/04/13 08:04

了解しました。解答ありがとうございます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存