こんにちは。最新の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();
}