(Ver 3.16dでの現象です)
自作ゲーム用をライブラリを作成中にバグと思われるものを見つけました。
クラスのコンストラクタでMakeScreenを実行した際、
ハンドルは得るのですがコンストラクタを終えた時点で無効なものに変わってしまいます。
すみませんが、対応よろしくお願いします。
それとこれは要望なのですが、
指定したハンドルが有効なものか調べる関数を追加していただけないでしょうか?
以下プログラムです。よろしくお願いします。
#include "DxLib.h"
#include <vector>
//DXライブラリ用のスクリーン(アルファチャンネル付き)を保持したり出力したりするクラス
//<!ポイント!>
//☆アルファチャンネル付きなので透過色が不要!
//☆アルファチャンネルが付いているので、アルファブレンドしてBoxなどを描きこんだ際、後ろに描いた画像が透けて見えます!(背景色が透けて見えない!)
//☆もちろんスクリーン自体にブレンドかけることもできます!
class DXScreen
{
int screen = 0;
void Setup()
{
if (GetGraphSize(screen, 0, 0) == -1)
{
//失敗時はscreenに有効なハンドルが入っていないので取得
RECT rc;
GetWindowCRect(&rc);
screen = MakeScreen(rc.right - rc.left, rc.bottom - rc.top, true);
while (GetASyncLoadNum() > 0 && !ProcessMessage());
}
}
public:
bool trans = false; //Sendの際に透過を行うフラグ
int blend_mode = DX_BLENDMODE_NOBLEND; //ブレンドモードを指定する
unsigned char pal = 255; //ブレンドモードのパラメータを指定する
DXScreen()
{
Setup();
Setup();//←試しにダメ押しで2回やった所、作成されませんでした。この時点では有効なハンドルの模様
}
~DXScreen() { DeleteGraph(screen); }
//=でスクリーンのハンドルを返す
operator int() const { return screen; }
//描画先をこのスクリーンに設定します。
//0:成功 -1:失敗
int Targeting()
{
Setup();//スクリーンの存在を確認し、無ければ作成
return SetDrawScreen(screen);
}
//スクリーンに描かれた内容を他のスクリーンに出力します
//do_erase:描き込み後、スクリーンを消去します。
//target_screen:出力先のスクリーンのハンドル。デフォルト = DX_SCREEN_BACK
void Send(bool do_erase = true, int target_screen = DX_SCREEN_BACK)
{
int buf = 0,
b_bl = 0, b_pal = 0;
buf = GetDrawScreen();
GetDrawBlendMode(&b_bl, &b_pal);
if (buf != target_screen)
SetDrawScreen(target_screen);
if (blend_mode != b_bl || pal != b_pal) SetDrawBlendMode(blend_mode, pal);
DrawGraph(0, 0, screen, trans);
if (blend_mode != b_bl || pal != b_pal) SetDrawBlendMode(b_bl, b_pal);
if (buf != target_screen)
SetDrawScreen(buf);
if (do_erase) Erase();
}
//スクリーンの内容を消去
void Erase()
{
int buf = GetDrawScreen();
if (buf != screen) SetDrawScreen(screen);
ClearDrawScreen();
if (buf != screen) SetDrawScreen(buf);
}
};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
SetGraphMode(1040,720,32);
ChangeWindowMode(true);
SetDoubleStartValidFlag(true);
SetWaitVSyncFlag(false);
SetMainWindowText("EXPERIENCE_APP");
if (DxLib_Init() == -1) return 0;
SetFontThickness(0);
SetDrawScreen(DX_SCREEN_BACK);
std::vector<DXScreen> screen;
screen.push_back(DXScreen());//←ここでMakeScreen(ハンドルを得るが、使えないハンドル)
ProcessMessage();
int set = 999;
//set = SetDrawScreen(screen[0]);//(検証用)1回目のハンドルを指定しているが-1返る
screen[0].Targeting();//←使えないハンドルなのでここでまたMakeScreen(ここで正常なハンドルとなる)
DrawString(300, 300, "baaaaaar\(^o^)/fooooooo", GetColor(192, 192, 192));
SetDrawScreen(DX_SCREEN_BACK);
screen[0].Send();//←DX_SCREEEN_BACKへ画面の内容を送る
ScreenFlip();
while (!ProcessMessage());
DxLib_End();
return 0;
}