やりたいこと。
・特定の場所をマウスクリックすると「メニュー」「ゲーム」「システム」などの画面に切り替えられるようにしたい。
現在の状況
・デバックを開始すると画面が真っ暗な状態からスタートする。(本来は最初から文字が表示されるはず)
・画面は真っ暗だが指定してる場所をクリックすると「メニュー」から「ゲーム」への切り替えはできる。
・その後は問題なく文字が表示され、ゲームからメニューへの切り替えも出来る。
・上記のことから最初だけ文字が表示されず、クリック動作時のプログラムは動作している。
解決策
・最初の画面(メニュー画面)に文字を出すコードをどこかに入れる。
・デバックしたタイミングで一度だけ実行されるコードを書いてメニュー画面を出す(必要ならやる)
問題点
・どこにメニュー画面の表示をするコードを入れるとよいか、またどのようなコードを入れるといいのかがわからない。またどこのコードの部分に問題があるのかがわからない。
以下ソースコード
//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のどちらかに文字を表示するコードを入れるとよいと予想を立て、何か所か思い当たることをして見たのですがダメでした。
問題点にも書きました通り、どこにどのようなコードを入れると最初からメニュー画面が表示されるかのアドバイスをください。
またもしよければ今後のためにも、なぜ表示されなかったかの原因を教えていただけると幸いです。よろしくお願いします。