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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
プリンの卵
記事: 4
登録日時: 11年前

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

#1

投稿記事 by プリンの卵 » 11年前

いま私はアクションゲームを「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か月くらいなのでまだいろいろ用語がわからなかったりします。
この原因がわかる人がいたら教えてください、お願いします。

derok
記事: 51
登録日時: 12年前

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

#2

投稿記事 by derok » 11年前

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

プリンの卵
記事: 4
登録日時: 11年前

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

#3

投稿記事 by プリンの卵 » 11年前

すみませんでした、質問文を少し急ぎで書いたのでいろいろ抜けているところがありました。
ご指摘ありがとうございます。
訂正コード

コード:

#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) にしてもフルスクリーンにならず、すぐにプログラムが終了してしまいます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 11年前

デフォルトだと640x480の16bitカラーでフルスクリーンだと思いますが、ビデオカードが対応していないのでは無いでしょうか?
32bitカラーの800x600とかに設定したら切り替わりませんか?

あとProcessMessage() がアチコチにあるのは不適切な処理ロジックです。
「補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

プリンの卵
記事: 4
登録日時: 11年前

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

#5

投稿記事 by プリンの卵 » 11年前

SetGraphMode(640, 480, 32)を加えたところ、フルスクリーンになりました! ありがとうございます!

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 11年前

意味は逆ですね。
状態遷移を適切に管理すれば、一番初めのwhileだけにしかProcessMessage(), ClearDrawScreen(), ScreenFlip();は必要ありません。

推奨される書き方は、「ゲームプログラミングの館」に掲載されています。
http://dixq.net/g/
メニュー画面の作り方
sp.3 メニュー画面の作り方.1
sp.4 メニュー画面の作り方.2
sp.5 メニュー画面の作り方.3
sp.7 メニュー画面の作り方 [選択項目編]
を見て頂くとよいでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

プリンの卵
記事: 4
登録日時: 11年前

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

#7

投稿記事 by プリンの卵 » 11年前

やっぱりプログラムは難しいですね、
はじめのwhileだけにProcessMessage(), ClearDrawScreen(), ScreenFlip();を入れて動くように勉強してきます。
解答ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る