トップページ > 記事閲覧
SetDrawAreaFull()直後の画面更新
名前:nsawa 日時: 2016/12/06 12:35

こんにちは。最新の12/5版のDxLibで、正しく描画されない事が発生しましたので、報告させて頂きます。 SetDrawAreaFull()の直後に画面を更新しようとすると、画面が正しく描画されないようです。 一つ前のバージョン(11/27版)までは問題無く描画できていたので、12/5版のDxLibで何か変わったのではないかと思いました。 確認した環境は、OSはWindows 10 64bit、GPUはGeForce GT 735MとIntel HD Graphics 4400、コンパイラはVC++6.0 SP6です。 問題を再現するテストプログラムは、以下をご参照ください。 #include "DxLib.h" int PlayerGraph; //描画するグラフィック int ScreenGraph; //描画可能画像(テスト3で使用する) int TestMode = 1; //実行するテスト関数の番号 static void Test1(), Test2(), Test3(), Test4(); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow) { //ウインドウモードにする。 ChangeWindowMode(TRUE); //DXライブラリ初期化処理 DxLib_Init(); //グラフィックのロード PlayerGraph = LoadGraph("Player.bmp");//グラフィックデータは何でも構いません。 //描画可能画像を作成する(テスト3で使用する) ScreenGraph = MakeScreen(640, 480, FALSE); //ループ while((ProcessMessage() == 0) && (CheckHitKey(KEY_INPUT_ESCAPE) == 0)) { //キー入力によって、実行するテスト関数を切り替える。 if(CheckHitKey(KEY_INPUT_1) != 0) { TestMode = 1; } if(CheckHitKey(KEY_INPUT_2) != 0) { TestMode = 2; } if(CheckHitKey(KEY_INPUT_3) != 0) { TestMode = 3; } if(CheckHitKey(KEY_INPUT_4) != 0) { TestMode = 4; } //テスト関数を実行する。 if(TestMode == 1) { Test1(); SetMainWindowText("テスト1"); } if(TestMode == 2) { Test2(); SetMainWindowText("テスト2"); } if(TestMode == 3) { Test3(); SetMainWindowText("テスト3"); } if(TestMode == 4) { Test4(); SetMainWindowText("テスト4"); } } //DXライブラリ使用の終了処理 DxLib_End(); return 0; } //■テスト1:結果 DxLib(11/27版)⇒問題無く表示される。DxLib(12/5版)⇒何も表示されない。 static void Test1() { //描画先画面を裏画面にセット SetDrawScreen(DX_SCREEN_BACK); //描画先画面をクリアする ClearDrawScreen(); //プレイヤーを描画する DrawGraph(100, 100, PlayerGraph, TRUE); //描画可能な領域を全画面にする(ダミー処理)⇒ここでこの関数を呼んでも影響は無いと思うのですが… SetDrawAreaFull(); //裏画面の内容を表画面に反映させる⇒※DxLib(12/5版)では何も表示されませんでした。 ScreenFlip(); } //■テスト2:結果 DxLib(11/27版)⇒問題無く表示される。DxLib(12/5版)⇒何も表示されない。 static void Test2() { //描画先画面を裏画面にセット SetDrawScreen(DX_SCREEN_BACK); //描画先画面をクリアする ClearDrawScreen(); //プレイヤーを描画する DrawGraph(100, 100, PlayerGraph, TRUE); //描画可能な領域を全画面にする(ダミー処理)⇒ここでこの関数を呼んでも影響は無いと思うのですが… SetDrawAreaFull(); //裏画面の内容を表画面に転送する⇒※DxLib(12/5版)では何も表示されませんでした。 ScreenCopy(); } //■テスト3:結果 DxLib(11/27版)⇒問題無く表示される。DxLib(12/5版)⇒何も表示されない。 static void Test3() { //描画先画面を描画可能画像にセット SetDrawScreen(ScreenGraph); //描画先画面をクリアする ClearDrawScreen(); //プレイヤーを描画する DrawGraph(100, 100, PlayerGraph, TRUE); //描画可能な領域を全画面にする(ダミー処理)⇒ここでこの関数を呼んでも影響は無いと思うのですが… SetDrawAreaFull(); //描画可能画像を表画面に転送する⇒※DxLib(12/5版)では何も表示されませんでした。 SetDrawScreen(DX_SCREEN_FRONT); DrawGraph(0, 0, ScreenGraph, FALSE); } //■テスト4:結果 DxLib(11/27版)でも、DxLib(12/5版)でも、問題無く表示される。 static void Test4() { //描画先画面を裏画面にセット SetDrawScreen(DX_SCREEN_BACK); //描画先画面をクリアする ClearDrawScreen(); //プレイヤーを描画する DrawGraph(100, 100, PlayerGraph, TRUE); //描画可能な領域を全画面にする(ダミー処理) SetDrawAreaFull(); //プレイヤーをもう一つ描画する DrawGraph(200, 100, PlayerGraph, TRUE); //裏画面の内容を表画面に反映させる⇒DxLib(11/27版)でも、DxLib(12/5版)でも、問題無く表示されました。 //テスト1とテスト4の結果の違いから推測するに、DxLib(12/5版)では、 //SetDrawAreaFull()の直後に表画面に転送しようとすると、正しく描画されないのではないかと思いました。 ScreenFlip(); }
メンテ

Page: 1 |

Re: SetDrawAreaFull()直後の画面更新 ( No.1 )
名前:管理人 日時:2016/12/07 01:02

ご報告&確認用コードの掲載ありがとうございます 12/5版で SetDrawArea に関するバグを発生させてしまっていました 修正版をアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // C++ Builder 10.1 Berlin 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』をして下さい)
メンテ
Re: SetDrawAreaFull()直後の画面更新 ( No.2 )
名前:nsawa(解決) 日時:2016/12/07 09:49

修正版をダウンロードさせて頂きました。 SetDrawAreaFull()の直後に画面更新を行っても問題無く描画出来る事を確認しました。 ご対応頂き誠に有難うございました。
メンテ

Page: 1 |

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

   クッキー保存