ページ 11

DXライブラリ関数 "ChangeWindowMode"について

Posted: 2016年7月30日(土) 00:49
by Celia
はじめてこの掲示板に質問させていただきます。

DXライブラリを用いてゲームの作成を行っているのですが、ChangeWindowMode関数でウインドウモードを変更すると、表示していた画像が消えてしまいます。
自分としては、メモリ上からグラフィックを削除しているためだと考えています。

コード:

#include "DxLib.h"

class Sample{
private:
	int image_bg_handle;
	bool tmpmode;
public:
	void Init();
	void Final();
	void Update();
	void Draw();
};

int Getkey(int keycode);
int z_keycount = 0;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
	SetGraphMode(1280, 720, 16);
	ChangeWindowMode(TRUE);
	if (DxLib_Init() == -1) return -1;
	SetDrawScreen(DX_SCREEN_BACK);

	Sample *sa1 = new Sample();
	sa1->Init();

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
		sa1->Update();
		sa1->Draw();
	}

	sa1->Final();
	delete sa1;

	DxLib_End();
	return 0;
}

int Getkey(int keycode){
	if (CheckHitKey(keycode) == 1) z_keycount++;
	else z_keycount = 0;
	return z_keycount;
}

void Sample::Init(){
	image_bg_handle = LoadGraph("sample.png");
	tmpmode = TRUE;
}

void Sample::Final(){
	DeleteGraph(image_bg_handle);
}

void Sample::Update(){
	if (Getkey(KEY_INPUT_Z)){
		tmpmode = !tmpmode;
		ChangeWindowMode(tmpmode);
	}
}

void Sample::Draw(){
	DrawGraph(0, 0, image_bg_handle, TRUE); //消えてしまう
	DrawString(0, 0, "test", 0x777777); //こちらは残り続ける
}
このような場合、Init関数を再び呼ぶと、bool tmpmodeまで書き替えられてしまい、意図した動作が得られなくなってしまいます。
何か解決する方法はないでしょうか、よろしくお願いします。

Re: DXライブラリ関数 "ChangeWindowMode"について

Posted: 2016年7月30日(土) 00:57
by みけCAT
Celia さんが書きました:このような場合、Init関数を再び呼ぶと、bool tmpmodeまで書き替えられてしまい、意図した動作が得られなくなってしまいます。
何か解決する方法はないでしょうか、よろしくお願いします。
素直に画像(など)を読み込む処理とtmpmode(など)を初期化する処理を別の関数にして、それらをInit関数で呼び出し、
ChangeWindowModeを使った後は画像(など)を読み込む処理の関数だけを呼び出せばいいのではないでしょうか?

Re: DXライブラリ関数 "ChangeWindowMode"について

Posted: 2016年7月30日(土) 01:18
by Celia
ChangeWindowModeではメモリ上からグラフィックを削除しているということで正しいでしょうか。
そうならば確かにグラフィックなどの読み込みを行う関数を作成すれば解決しますね。
アドバイスありがとうございます。

Re: DXライブラリ関数 "ChangeWindowMode"について

Posted: 2016年7月30日(土) 01:26
by みけCAT
DXライブラリ置き場 リファレンスページより転載
宣言 int ChangeWindowMode( int Flag ) ;

(中略)

<注意>
 この関数を実行するとロードしたすべてのグラフィックハンドルと3Dモデルハンドル、 作成したフォントハンドルは自動的に削除され、SetDrawArea, SetDrawScreen, SetDrawMode, SetDrawBlendMode, SetDrawBright 等の描画に関係する設定を行う関数による設定も全て初期状態に戻りますので、 画面モード変更後 LoadGraph関数や CreateFontToHandle関数等で再度ハンドルを作成し直し、 描画可能領域、描画対象画面等の各種描画系の設定も再度行う必要があります。

Re: DXライブラリ関数 "ChangeWindowMode"について

Posted: 2016年7月30日(土) 01:32
by Celia
大変申し訳ございません。
リファレンスページは確認していたはずなのですが、どうも見落としていたようです・・・
恥ずかしい質問をしてしまい本当にすみません。

教えていただきありがとうございました。