トップページ > 記事閲覧
MakeScreenが上手く動きません
名前:三枚おろし大根 日時: 2016/08/18 23:29

(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; }
メンテ

Page: 1 |

Re: MakeScreenが上手く動きません ( No.1 )
名前:ジンセイ 日時:2016/08/18 23:54

screen.push_back(DXScreen());//←ここでMakeScreen(ハンドルを得るが、使えないハンドル) の箇所で、DXScreen()は一時オブジェクトと呼ばれるもので push_back()された時には既に破棄(デストラクタが呼ばれる)されてしまいます。 デストラクタでDeleteGraph()を呼び出しているので使えないハンドルになっているのでしょう。 デストラクタにprintf()を仕込んでみるか、デバッガでステップ実行してみると、 DeleteGraph()が呼ばれていることがわかると思います。
メンテ
Re: MakeScreenが上手く動きません ( No.2 )
名前:三枚おろし大根(解決) 日時:2016/08/19 00:05

なるほどそういうことだったのですね。 認識を間違えていたようです。newとかと同じように解釈してました。 解決しました、ありがとうございました!
メンテ
Re: MakeScreenが上手く動きません ( No.3 )
名前:yumetodo 日時:2016/08/27 22:09

moveコンストラクタ書けばいい話では・・・ https://github.com/Nagarei/DxLibEx/blob/master/dxlibex/texture/texture2d.hpp#L61
メンテ

Page: 1 |

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

   クッキー保存