ユーマ さんが書きました:プログラムを始めたばかりの初心者です。
どの程度まで理解されておられるのか具体的に記載いただけないですか。
まずC言語でWindowsプログラムを作成されたことがあるのでしょうか。
猫でもわかるプログラミング(WindowsSDK編 第1部)
少なくともWindowsにてCreateWindowとWinProcの関係について理解を深めることをお勧めします。
ユーマ さんが書きました:
ここには ProcessMessage(),ClearDrawScreen(),ScreenFlip() が複数の場所に書かれているといけない。
私は、なぜこれがダメなのかを知りたいです。
まず、題材としているゲームは、1フレームウィンドウを持ち複数のシーンを構成するアプリといえます。
タイトル、ゲーム、ランキング、オプション設定を1フレームウィンドウでシーンを切り替えるような形となろうとおもいます。
その際、シーンごとで各メッセージ(選択、コントローラーからの入力など)を処理したいとしても通知されてくるのは最初につくったフレームウィンドウです。
そもそもメッセージ取得は1フレームウィンドウにつき1つが原則です。
CreateWindow、CreateWindowEx、CreateDialogのAPI関数リファレンスを参照ください。
CreateWindow
CreateWindowEx
CreateDialog
そして、メッセージと再描画までの一連の流れとしては、
1.メッセージ取得
2.メッセージに対応した処理
(以下は必要に応じて、または安全策として必ず背景を消去し再描画させるという考えもあり)
3.背景消去
4.再描画
シーンに合わせた処理という点で参考になりえるのは
LED、液晶が搭載されている炊飯器や電気ポット、電子レンジといったものでしょうか。
炊飯器でいくと炊飯メニューボタンを押すと玄米やらが選べて
炊飯量にあわせ炊飯に必要な時間まで表示されたりします。
表示内容が押されたボタンなどに切り替わる様子は、ゲームタイトルからゲームを選択したりゲームタイトルからオプション設定へ、ゲームタイトルからランキングへといった遷移に似ています。
また基本無料のスマホゲームでも似た構造が多いですね。
コードの一例です。このままではコンパイルは通りません。参考までに。。
コード:
//関数引数として通知メッセージ、実際ゲームアプリでは足りないと思われる。
void dispatchMessage(int message) {
swtich(ScreenMode) {
case SC_TITLE;
dispatchMsgTitle(message);
break;
case SC_GAME:
dispatchMsgGame(message);
break;
case SC_SETTING:
dispatchMsgSetting(message);
break;
case SC_RANKING:
dispatchMsgRanking(message);
break;
}
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode( TRUE ); // ウィンドウモードに設定
DxLib_Init(); // DXライブラリ初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //描画先を裏画面に設定
//他色々必要に応じて初期処理
ScreenMode = SC_TITLE;
int notifyMessage = 0;
while( 1 ){
if( ProcessMessage() != 0 ){ // メッセージ処理
break;//ウィンドウの×ボタンが押されたらループを抜ける
}
//notifyMessageにはキー入力、コントローラーからの通知内容を格納する
//関数パラメータは1つだけでは足りないと思われる。
dispatchMessage(notifyMessage);
ClearDrawScreen();// 画面を消す
/* ====== 描画処理 START ====== */
/* ====== 描画処理 END ====== */
ScreenFlip(); //裏画面を表画面に反映
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}