現在『メニュー画面の作り方 (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のどちらかに文字を表示するコードを入れるとよいと予想を立て、何か所か思い当たることをして見たのですがダメでした。
問題点にも書きました通り、どこにどのようなコードを入れると最初からメニュー画面が表示されるかのアドバイスをください。
またもしよければ今後のためにも、なぜ表示されなかったかの原因を教えていただけると幸いです。よろしくお願いします。
現在『メニュー画面の作り方 (C++編)』を元にメニュー画面を作っているのですが、デバックすると真っ暗でスタートし、上手くいかず躓いているのでお助けいただけるとありがたいです。
やりたいこと。
・特定の場所をマウスクリックすると「メニュー」「ゲーム」「システム」などの画面に切り替えられるようにしたい。
現在の状況
・デバックを開始すると画面が真っ暗な状態からスタートする。(本来は最初から文字が表示されるはず)
・画面は真っ暗だが指定してる場所をクリックすると「メニュー」から「ゲーム」への切り替えはできる。
・その後は問題なく文字が表示され、ゲームからメニューへの切り替えも出来る。
・上記のことから最初だけ文字が表示されず、クリック動作時のプログラムは動作している。
解決策
・最初の画面(メニュー画面)に文字を出すコードをどこかに入れる。
・デバックしたタイミングで一度だけ実行されるコードを書いてメニュー画面を出す(必要ならやる)
問題点
・どこにメニュー画面の表示をするコードを入れるとよいか、またどのようなコードを入れるといいのかがわからない。またどこのコードの部分に問題があるのかがわからない。
以下ソースコード
[nfo]
//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;
}[/nfo]
[nfo]
//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));
}
[/nfo]
[nfo]
//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));
}
[/nfo]
[nfo]
//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;
}
[/nfo]
[nfo]
//Game.h
#pragma once
//更新
void Game_Update();
//描画
void Game_Draw();
[/nfo]
[nfo]
//Menu.h
#pragma once
//更新
void Menu_Update();
//描画
void Menu_Draw();
[/nfo]
[nfo]
//SceneMgr.h
#pragma once
typedef enum {
eScene_Menu, //メニュー画面
eScene_Game, //ゲーム画面
} eScene;
//更新
void SceneMgr_Update();
//描画
void SceneMgr_Draw();
// 引数 nextScene にシーンを変更する
void SceneMgr_ChangeScene(eScene nextScene);
[/nfo]
SceneMgr.cppかMain.ccpのどちらかに文字を表示するコードを入れるとよいと予想を立て、何か所か思い当たることをして見たのですがダメでした。
問題点にも書きました通り、どこにどのようなコードを入れると最初からメニュー画面が表示されるかのアドバイスをください。
またもしよければ今後のためにも、なぜ表示されなかったかの原因を教えていただけると幸いです。よろしくお願いします。