ページ 11

DXLibでChangeWindowMode(FALSE)にしてもフルスクリーンにならない原因

Posted: 2014年6月05日(木) 15:00
by プリンの卵
いま私はアクションゲームを「VS2013express」で「DXLib」を使って作っています。
それで作っていく途中で ChangeWindowMode をFALSE にしてもフルスクリーンにならず、すぐにプログラムが終了してしまいます。
作り始めのころは FALSE にしたらフルスクリーンになったのですが...
コードは

コード:

#include <math.h>
#include "DxLib.h"
int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
	for (int i = 0; i < 256; i++){
		if (tmpKey[i] != 0){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		}
		else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(FALSE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK), SetWindowText("*********");

	//int,float,画像ロード,サウンドロード,初期化

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0){
	//メニューの初期化
		
		while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0 && Menu_flag == 1){
		//メニュー処理

		}
		
		//ステージ1の初期化
		while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0 && Stage1_flag == 1){
		//ステージ1の処理

		}

		//ステージ2の初期化
		while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0 && Stage2_flag == 1){
		//ステージ2の処理

		}
	DxLib_End();    // DXライブラリ終了処理
	return 0;
}

私はまだプログラム(C、C++)を初めて1か月くらいなのでまだいろいろ用語がわからなかったりします。
この原因がわかる人がいたら教えてください、お願いします。

Re: DXLibでChangeWindowMode(FALSE)にしてもフルスクリーンにならない原因

Posted: 2014年6月05日(木) 15:40
by derok
そもそもコンパイル(プログラムの実行ファイルを作る事)が、 } が一つ足りないので出来ないのですが。
追記
後、Menu_flaga、Stage1_flag、Stage2_flagといった定義(int~みたいなもの)されてない変数が使われていますね。
それを修正したところ、ちゃんとフルスクリーンになりましたよ。

Re: DXLibでChangeWindowMode(FALSE)にしてもフルスクリーンにならない原因

Posted: 2014年6月05日(木) 21:49
by プリンの卵
すみませんでした、質問文を少し急ぎで書いたのでいろいろ抜けているところがありました。
ご指摘ありがとうございます。
訂正コード

コード:

#include <math.h>
#include "DxLib.h"
int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
	for (int i = 0; i < 256; i++){
		if (tmpKey[i] != 0){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		}
		else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(FALSE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK), SetWindowText("*********");

	//int,float,画像ロード,サウンドロード,初期化
	int Menu_flag = 1;
	int Stage1_flag = 0;
	int Stage2_flag = 0;

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0){
	//メニューの初期化
		
		while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0 && Menu_flag == 1){
		//メニュー処理
		//Menu_flag = 0 にして Stage1_flag = 1 にする処理
		}
		
		//ステージ1の初期化
		while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0 && Stage1_flag == 1){
		//ステージ1の処理
		//Stage1_flag = 0 にして Stage2_flag = 1 にする処理
		}

		//ステージ2の初期化
		while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && gpUpdateKey() == 0 && Stage2_flag == 1){
		//ステージ2の処理
		//Stage2_flag = 0 にして Menu_flag = 1 にする処理
		}
	}
	DxLib_End();    // DXライブラリ終了処理
	return 0;
}

while の中にある 〇〇_flag みたいなやつはとりあえずなくても黒いウィンドウは出ると思い、省いていました。〇〇_flag は訂正したコードの順で切り替えしています。
お騒がせしてすみませんでした。
しかしこれでも ChangeWindowMode(FALSE) にしてもフルスクリーンにならず、すぐにプログラムが終了してしまいます。

Re: DXLibでChangeWindowMode(FALSE)にしてもフルスクリーンにならない原因

Posted: 2014年6月05日(木) 21:55
by softya(ソフト屋)
デフォルトだと640x480の16bitカラーでフルスクリーンだと思いますが、ビデオカードが対応していないのでは無いでしょうか?
32bitカラーの800x600とかに設定したら切り替わりませんか?

あとProcessMessage() がアチコチにあるのは不適切な処理ロジックです。
「補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html

Re: DXLibでChangeWindowMode(FALSE)にしてもフルスクリーンにならない原因

Posted: 2014年6月05日(木) 22:55
by プリンの卵
SetGraphMode(640, 480, 32)を加えたところ、フルスクリーンになりました! ありがとうございます!

あと少し気になるのですが ProcessMessage(), ClearDrawScreen(), ScreenFlip(); はこのコードだと一番初めのwhileには必要ない。ということでしょうか?

Re: DXLibでChangeWindowMode(FALSE)にしてもフルスクリーンにならない原因

Posted: 2014年6月05日(木) 23:27
by softya(ソフト屋)
意味は逆ですね。
状態遷移を適切に管理すれば、一番初めのwhileだけにしかProcessMessage(), ClearDrawScreen(), ScreenFlip();は必要ありません。

推奨される書き方は、「ゲームプログラミングの館」に掲載されています。
http://dixq.net/g/
メニュー画面の作り方
sp.3 メニュー画面の作り方.1
sp.4 メニュー画面の作り方.2
sp.5 メニュー画面の作り方.3
sp.7 メニュー画面の作り方 [選択項目編]
を見て頂くとよいでしょう。

Re: DXLibでChangeWindowMode(FALSE)にしてもフルスクリーンにならない原因

Posted: 2014年6月05日(木) 23:38
by プリンの卵
やっぱりプログラムは難しいですね、
はじめのwhileだけにProcessMessage(), ClearDrawScreen(), ScreenFlip();を入れて動くように勉強してきます。
解答ありがとうございました!