メニュー画面が真っ暗

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

メニュー画面が真っ暗

#1

投稿記事 by 白雪 » 2年前

現在『メニュー画面の作り方 (C++編)』を元にメニュー画面を作っているのですが、デバックすると真っ暗でスタートし、上手くいかず躓いているのでお助けいただけるとありがたいです。

やりたいこと。
・特定の場所をマウスクリックすると「メニュー」「ゲーム」「システム」などの画面に切り替えられるようにしたい。

現在の状況
・デバックを開始すると画面が真っ暗な状態からスタートする。(本来は最初から文字が表示されるはず)
・画面は真っ暗だが指定してる場所をクリックすると「メニュー」から「ゲーム」への切り替えはできる。
・その後は問題なく文字が表示され、ゲームからメニューへの切り替えも出来る。
・上記のことから最初だけ文字が表示されず、クリック動作時のプログラムは動作している。

解決策
・最初の画面(メニュー画面)に文字を出すコードをどこかに入れる。
・デバックしたタイミングで一度だけ実行されるコードを書いてメニュー画面を出す(必要ならやる)

問題点
・どこにメニュー画面の表示をするコードを入れるとよいか、またどのようなコードを入れるといいのかがわからない。またどこのコードの部分に問題があるのかがわからない。

以下ソースコード
//main.ccp

#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;
}
//Menu.ccp

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

void Menu_Update() {

	int mouseMX;//マウスカーソルのX座標
	int mouseMY;//マウスカーソルのY座標

	GetMousePoint(&mouseMX, &mouseMY);//マウスカーソルの位置を取得
	int Mouse = GetMouseInput();//マウスカーソルのボタンの状態を取得

	while (!ProcessMessage()) {
		GetMousePoint(&mouseMX, &mouseMY); 
		if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) { 
			if (0 < mouseMX && mouseMX < 20 && 40 < mouseMY && mouseMY < 60)//クリック指定場所
				break;
		}
		SceneMgr_ChangeScene(eScene_Game);
	}
}
void Menu_Draw() {
    DrawString(0, 0, "メニュー画面です。", GetColor(255, 255, 255));
    DrawString(0, 40, "□←押すとゲーム画面に進みます。", GetColor(255, 255, 255));
}
//Game.ccp

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

//更新
void Game_Update() {

	int mouseGX;//マウスカーソルのX座標
	int mouseGY;//マウスカーソルのY座標

	GetMousePoint(&mouseGX, &mouseGY);//マウスカーソルの位置を取得
	int Mouse = GetMouseInput();//マウスカーソルのボタンの状態を取得

	while (!ProcessMessage()) {
		GetMousePoint(&mouseGX, &mouseGY); //マウスの座標を取得
		if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) { //左クリックを検知
			if (0 < mouseGX && mouseGX < 20 && 40 < mouseGY && mouseGY < 60)//クリック指定場所
				break;
		}
		SceneMgr_ChangeScene(eScene_Menu);
    }
}
void Game_Draw() {
    DrawString(0, 0, "ゲーム画面です。", GetColor(255, 255, 255));
    DrawString(0, 40, "□←押すとメニュー画面に戻ります。", GetColor(255, 255, 255));
}
//SceneMgr.ccp

#include "DxLib.h"
#include "Game.h"
#include "Menu.h"
#include "SceneMgr.h"

static eScene Scene = eScene_Menu;    //シーン管理変数

//更新
void SceneMgr_Update() {
    switch (Scene) {       //シーンによって処理を分岐
    case eScene_Menu:    //現在の画面がメニューなら
        Menu_Update();   //メニュー画面の更新処理をする
        break;//以下略
    case eScene_Game:
        Game_Update();
        break;
    }
}

//描画
void SceneMgr_Draw() {
    switch (Scene) {      //シーンによって処理を分岐
    case eScene_Menu:   //現在の画面がメニュー画面なら
        Menu_Draw();    //メニュー画面の描画処理をする
        break;//以下略
    case eScene_Game:
        Game_Draw();
        break;
    }
}

// 引数 nextScene にシーンを変更する
void SceneMgr_ChangeScene(eScene NextScene) {
    Scene = NextScene;
}
//Game.h

#pragma once

//更新
void Game_Update();

//描画
void Game_Draw(); 
//Menu.h

#pragma once

//更新
void Menu_Update();

//描画
void Menu_Draw();
//SceneMgr.h

#pragma once

typedef enum {
    eScene_Menu,    //メニュー画面
    eScene_Game,    //ゲーム画面
} eScene;

//更新
void SceneMgr_Update();

//描画
void SceneMgr_Draw();

// 引数 nextScene にシーンを変更する
void SceneMgr_ChangeScene(eScene nextScene); 
SceneMgr.cppかMain.ccpのどちらかに文字を表示するコードを入れるとよいと予想を立て、何か所か思い当たることをして見たのですがダメでした。

問題点にも書きました通り、どこにどのようなコードを入れると最初からメニュー画面が表示されるかのアドバイスをください。
またもしよければ今後のためにも、なぜ表示されなかったかの原因を教えていただけると幸いです。よろしくお願いします。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: メニュー画面が真っ暗

#2

投稿記事 by あたっしゅ » 2年前

東上☆海美☆「
ファイル分けが面倒くさかったので、いちファイルになってるみみ。
注釈が入っているので、わかるみみ?

DxLib は、メインループ以外で ProcessMessage() したらいかんみみ。

あと、ボタンを押しっぱなしにした場合の処理もつけておいたみみ。

コード:

//
// https://dixq.net/forum/viewtopic.php?f=3&t=21322&sid=23ff7a2eb88383ec13fc497fedb1d4ad
// メニュー画面が真っ暗 - ミクプラ(ja)
//
// for Visual Studio 2022 on Windows11 Insider Preview
//
#include<DxLib.h>

 
//
//Game.h
//
//#pragma once

//更新
void Game_Update();
void Game_Update_Button_Pressed();

//描画
void Game_Update();
void Game_Update_Button_Pressed();


//
//Menu.h
//
//#pragma once

//更新
void Game_Update();
void Game_Update_Button_Pressed();

//描画
void Game_Update();
void Game_Update_Button_Pressed();


//
// //SceneMgr.h
//
//#pragma once

typedef enum {
    eScene_Menu,                //メニュー画面
    eScene_Menu_Button_Pressed, //
    eScene_Game,                //ゲーム画面
    eScene_Game_Button_Pressed, //
} eScene;

//更新
void SceneMgr_Update();

//描画
void SceneMgr_Draw();

// 引数 nextScene にシーンを変更する
void SceneMgr_ChangeScene(eScene nextScene);


//
//main.ccp
//
//#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;
}


//
//Menu.ccp
//
//#include "Menu.h"
//#include "SceneMgr.h"
//#include "DxLib.h"

void Menu_Update() {
    int mouseMX;//マウスカーソルのX座標
    int mouseMY;//マウスカーソルのY座標

    GetMousePoint(&mouseMX, &mouseMY);//マウスカーソルの位置を取得
    //int Mouse = GetMouseInput();//マウスカーソルのボタンの状態を取得

    //while (!ProcessMessage()) {
    GetMousePoint(&mouseMX, &mouseMY);
    if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) {
        if (0 < mouseMX && mouseMX < 20 && 40 < mouseMY && mouseMY < 60) { //クリック指定場所
            //break;
            SceneMgr_ChangeScene(eScene_Menu_Button_Pressed);
        }
    }
    //SceneMgr_ChangeScene(eScene_Game);
//}
}


void Menu_Draw() {
    DrawString(0, 0, "メニュー画面です。", GetColor(255, 255, 255));
    DrawString(0, 40, "□←押すとゲーム画面に進みます。", GetColor(255, 255, 255));
}


void Menu_Update_Button_Pressed() {
    if (GetMouseInput() == 0) {
        SceneMgr_ChangeScene(eScene_Game);
    }
//}
}


void Menu_Draw_Button_Pressed() {
    DrawString(0, 0, "ボタンが押された。", GetColor(255, 255, 255));
}


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

//更新
void Game_Update() {
    int mouseGX;//マウスカーソルのX座標
    int mouseGY;//マウスカーソルのY座標

    GetMousePoint(&mouseGX, &mouseGY);//マウスカーソルの位置を取得
    //int Mouse = GetMouseInput();//マウスカーソルのボタンの状態を取得

    //while (!ProcessMessage()) {
    GetMousePoint(&mouseGX, &mouseGY); //マウスの座標を取得
    if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) { //左クリックを検知
        if (0 < mouseGX && mouseGX < 20 && 40 < mouseGY && mouseGY < 60) { //クリック指定場所
            //break;
            SceneMgr_ChangeScene(eScene_Game_Button_Pressed);
            return;
        }
    }
    //SceneMgr_ChangeScene(eScene_Menu);
//}
}


void Game_Draw() {
    DrawString(0, 0, "ゲーム画面です。", GetColor(255, 255, 255));
    DrawString(0, 40, "□←押すとメニュー画面に戻ります。", GetColor(255, 255, 255));
}


void Game_Update_Button_Pressed() {
    if (GetMouseInput() == 0) {
        SceneMgr_ChangeScene(eScene_Menu);
    }
}


void Game_Draw_Button_Pressed() {
    DrawString(0, 0, "ボタンが押された。", GetColor(255, 255, 255));
}


//
//SceneMgr.ccp
//
//#include "DxLib.h"
//#include "Game.h"
//#include "Menu.h"
//#include "SceneMgr.h"

static eScene Scene = eScene_Menu;    //シーン管理変数

//更新
void SceneMgr_Update() {
    switch (Scene) {       //シーンによって処理を分岐
    case eScene_Menu:    //現在の画面がメニューなら
        Menu_Update();   //メニュー画面の更新処理をする
        break;//以下略

    case eScene_Menu_Button_Pressed:
        Menu_Update_Button_Pressed();
        break;//以下略

    case eScene_Game:
        Game_Update();
        break;
    case eScene_Game_Button_Pressed:
        Game_Update_Button_Pressed();
        break;
    }
}


//描画
void SceneMgr_Draw() {
    switch (Scene) {      //シーンによって処理を分岐
    case eScene_Menu:   //現在の画面がメニュー画面なら
        Menu_Draw();    //メニュー画面の描画処理をする
        break;//以下略

    case eScene_Menu_Button_Pressed:
        Menu_Draw_Button_Pressed();
        break;//以下略

    case eScene_Game:
        Game_Draw();
        break;

    case eScene_Game_Button_Pressed:
        Game_Draw_Button_Pressed();
        break;
    }
}

// 引数 nextScene にシーンを変更する
void SceneMgr_ChangeScene(eScene NextScene) {
    Scene = NextScene;
}


// end.
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

白雪(解決済み)

Re: メニュー画面が真っ暗

#3

投稿記事 by 白雪(解決済み) » 2年前

回答ありがとうございます!

若干のエラー(定義されていないなど)が出て実行されないことがおきましたが、修正したらきちんと最初の画面から描画されるようになりました!
無事、実装することが出来ました!

DxLib はメインループ以外で ProcessMessage() をしたら駄目なんですね。知りませんでした。
今後気を付けます。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: メニュー画面が真っ暗

#4

投稿記事 by あたっしゅ » 2年前

東上☆海美☆「
> 若干のエラー(定義されていないなど)が出て実行されないことがおきましたが、
> 修正したらきちんと最初の画面から描画されるようになりました!

私のコードは、Windows 11 Insider Preview で Visual Studio 2022 でビルドできたものですが、
どこにエラーが出ましたでしょうか ?
貴方の開発環境の明示を求めますみみ。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

白雪

Re: メニュー画面が真っ暗

#5

投稿記事 by 白雪 » 2年前

すいません。気が付くのが遅くなりました。

開発環境は Visual Studio Community 2019 です。

以下エラ―内容
エラー (アクティブ)	E0020	識別子 "Menu_Update" が定義されていません
エラー (アクティブ)	E0020	識別子 "Menu_Update_Button_Pressed" が定義されていません
エラー (アクティブ)	E0020	識別子 "Menu_Draw" が定義されていません
エラー (アクティブ)	E0020	識別子 "Menu_Draw_Button_Pressed" が定義されていません
エラー (アクティブ)	E0020	識別子 "Game_Draw" が定義されていません
エラー (アクティブ)	E0020	識別子 "Game_Draw_Button_Pressed" が定義されていません

返信

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