ウィンドウが一瞬で消えてしまう

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
きりい

ウィンドウが一瞬で消えてしまう

#1

投稿記事 by きりい » 6年前

はじめまして。
今メニュー画面を作るプログラムを書いていたのですが。
ウィンドウが一瞬で閉じてしまって、デバッグで実行しても目立ったエラーは発見されずわかりません。

main.cpp

コード:

#include"DxLib.h"
#include"SceneMgr.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

	while (ScreenFlip == 0 && ProcessMessage == 0 && ClearDrawScreen == 0) {
		SceneMgr_Update();
		SceneMgr_Draw();
	}

	DxLib_End();
	return 0;
}
SceneMgr.cpp

コード:

#include"DxLib.h"
#include"Title.h"
#include"Game.h"
#include"MusicSelect.h"
#include"Config.h"
#include"SceneMgr.h"


static eScene Scene = eScene_Title;//現在のシーン=タイトル画面

void SceneMgr_Update() {
	switch (Scene) {
	case eScene_Title:
		Title_Update();
		break;
	case eScene_MusicSelect:
		MusicSelect_Update();
		break;
	case eScene_Game:
		Game_Update();
		break;
	case eScene_Config:
		Config_Update();
		break;
	}
}

void SceneMgr_Draw() {
	switch (Scene) {
	case eScene_Title:
		Title_Draw();
		break;
	case eScene_MusicSelect:
		MusicSelect_Draw();
		break;
	case eScene_Game:
		Game_Draw();
		break;
	case eScene_Config:
		Config_Draw();
		break;
	}
}
//引数 NextSceneに変更
void SceneMgr_ChangeScene(eScene NextScene) {
	Scene = NextScene;
}
SceneMgr.h

コード:

#pragma once
//#ifndef DEF_SCENEMGR_H
//#define DEF_SCENEMGR_H

typedef enum {
	eScene_Title,//タイトル画面
	eScene_MusicSelect,//曲選択画面
	eScene_Game,//ゲーム画面
	eScene_Config//設定画面
}eScene;

//更新
void SceneMgr_Update();

//描画
void SceneMgr_Draw();

//引数NextSceneに変更
void SceneMgr_ChangeScene(eScene NextScene);
//#endif
Config.cpp

コード:

#include"DxLib.h"
//#include"Keyboard.h"
#include"Config.h"
#include"SceneMgr.h"

void Config_Update() {
	//if (Keyboard_Get(KEY_INPUT_ESCAPE) != 0) {
	if (CheckHitKey(KEY_INPUT_ESCAPE) != 0) {
		SceneMgr_ChangeScene(eScene_Title);
	}
}
void Config_Draw() {
	DrawString(250,250,"ESCキーでタイトルに戻る",GetColor(255,255,255));
	//DrawString(0,0,"")
}
Config.h

コード:

#pragma once
//#ifndef DEF_CONFIG_H
//#define DEF_CONFIG_H

//更新
void Config_Update();

//描画
void Config_Draw();

//#endif
MusicSelect.cpp

コード:

#include"DxLib.h"
#include"Game.h"
//#include"Keyboard.h"
#include"MusicSelect.h"
#include"SceneMgr.h"

void MusicSelect_Update() {
	//if (Keyboard_Get(KEY_INPUT_G) != 0) {
	if (CheckHitKey(KEY_INPUT_G) != 0) {
		SceneMgr_ChangeScene(eScene_Game);
	}
	//if (Keyboard_Get(KEY_INPUT_ESCAPE) != 0) {
	if (CheckHitKey(KEY_INPUT_ESCAPE) != 0) {
		SceneMgr_ChangeScene(eScene_Title);
	}
}

void MusicSelect_Draw() {
	DrawString(250, 250, "Gキーでゲーム画面に行く", GetColor(255, 255, 255));
	DrawString(0, 0, "ESCキーでタイトルに戻る", GetColor(255, 255, 255));
}
MusicSelect.h

コード:

#pragma once
//#ifndef DEF_MUSICSELECT_H
//#define DEF_MUSICSELECT_H

//更新
void MusicSelect_Update();

//描画
void MusicSelect_Draw();

//#endif
Title.cpp

コード:

//#include"Keyboard.h"
#include"Title.h"
#include"MusicSelect.h"
#include"SceneMgr.h"

void Title_Update() {
	//if (Keyboard_Get(KEY_INPUT_M) != 0) {
	if (CheckHitKey(KEY_INPUT_M) != 0) {
		SceneMgr_ChangeScene(eScene_MusicSelect);
	}
	//if (Keyboard_Get(KEY_INPUT_C) != 0) {
	if (CheckHitKey(KEY_INPUT_ESCAPE) != 0) {
		SceneMgr_ChangeScene(eScene_Config);
	}
}

void Title_Draw() {
	DrawString(250, 250, "Mキーで曲選択", GetColor(255, 255, 255));
	DrawString(250, 280, "Sキーで設定画面", GetColor(255, 255, 255));
	DrawString(0, 0, "ESCキーでタイトル画面に戻る",GetColor(255,255,255));
}
Title.h

コード:

#pragma once
//#ifndef DEF_TITLE_H
//#define DEF_TITLE_H

//更新
void Title_Update();

//描画
void Title_Draw();

//#endif
Game.cpp

コード:

#include"DxLib.h"
#include"Game.h"
//#include"Keyboard.h"
#include"SceneMgr.h"

void Game_Update() {
	//if (Keyboard_Get(KEY_INPUT_ESCAPE) != 0) {//ESCキーが押されたらタイトルに戻る
	if(CheckHitKey(KEY_INPUT_ESCAPE)!=0){
		SceneMgr_ChangeScene(eScene_Title);
	}
}

void Game_Draw() {
	DrawString(250,250,"ゲーム画面 score:0 record:0",GetColor(255,255,255));
	DrawString(0, 0, "ESCキーでタイトルに戻る", GetColor(255, 255, 255));
}
Game.h

コード:

#pragma once
//#ifndef DEF_GAME_H
//#define DEF_GAME_H

//更新
void Game_Update();

//描画
void Game_Draw();

//#endif
ちなみにもとになったサイトのURLを張っておきます。
https://dixq.net/g/sp_04.html
よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ウィンドウが一瞬で消えてしまう

#2

投稿記事 by みけCAT » 6年前

main.cpp内のwhile文の条件が、
「関数を呼び出した戻り値」ではなく「関数のアドレス」を0と比較するようになっていますね。
通常の環境では関数のアドレスは0にはならないはずなので、これでは常に偽になり、
ループに入らずに終了してしまうでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

きりい

Re: ウィンドウが一瞬で消えてしまう

#3

投稿記事 by きりい » 6年前

みけCAT さんが書きました:
6年前
main.cpp内のwhile文の条件が、
「関数を呼び出した戻り値」ではなく「関数のアドレス」を0と比較するようになっていますね。
通常の環境では関数のアドレスは0にはならないはずなので、これでは常に偽になり、
ループに入らずに終了してしまうでしょう。
言われてよく見て見たら確かにかっこが抜けて戻り値ではなくアドレスを比較するようになってました。
おかげでこの問題を解決することが出来ました。
ありがどうございました。

返信

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