#include "DxLib.h"
// メニュー項目のクラス
class MenuElement_t{
public:
char name[128]; // 項目名格納用変数
int x, y; // 座標格納用変数
int state; // 0:初期状態 1:オンマウス 2:クリックされた
void OnClick(int i){ //あとで処理を変える
switch (i){
case 0:
//ゲームスタート
DrawString(0, 0, "ゲームスタート", GetColor(100, 100, 100));
break;
case 1:
//おまけ
DrawString(0, 0, "おまけ", GetColor(100, 100, 100));
break;
case 2:
//ヘルプ
DrawString(0, 0, "ヘルプ", GetColor(100, 100, 100));
break;
case 3:
//コンフィグ
DrawString(0, 0, "コンフィグ", GetColor(100, 100, 100));
break;
case 4:
//ゲーム終了
DrawString(0, 0, "ゲーム終了", GetColor(100, 100, 100));
break;
default:
//エラー
DrawString(0, 0, "エラー", GetColor(100, 100, 100));
break;
}
}
};
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定
// メニュー項目要素を5つ作る
MenuElement_t MenuElement[5] = {
{ "ゲームスタート",100, 100, 0 }, // タグの中身の順番で格納される。
{ "おまけ", 100, 150, 0 },
{ "ヘルプ", 100, 200, 0 },
{ "コンフィグ", 100, 250, 0 },
{ "ゲーム終了", 100, 300, 0 }
};
int MouseX, MouseY;
// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キー更新)
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
// 計算フェーズ
GetMousePoint(&MouseX, &MouseY); //マウスの座標取得
for (int i = 0; i < 5; i++){
if (MenuElement[i].x < MouseX && MouseX < (MenuElement[i].x + GetDrawStringWidth(MenuElement[i].name, strlen(MenuElement[i].name)))
&& MenuElement[i].y < MouseY && MouseY < (MenuElement[i].y + 16)){ //←16:文字の高さ(初期値?) ↑文字列の幅
MenuElement[i].state = 1;
if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0)
{
// 押されている
MenuElement[i].state = 2;
}
}
else{
MenuElement[i].state = 0;
}
}
// 描画フェーズ
for (int i = 0; i<5; i++){ // メニュー項目数である5個ループ処理
switch (MenuElement[i].state){ // 0:初期状態 1:オンマウス 2:クリックされた
case 0:
DrawFormatString(MenuElement[i].x, MenuElement[i].y, GetColor(255, 255, 255), MenuElement[i].name);
break;
case 1:
DrawFormatString(MenuElement[i].x, MenuElement[i].y, GetColor( 0, 255, 0), MenuElement[i].name);
break;
case 2:
DrawFormatString(MenuElement[i].x, MenuElement[i].y, GetColor( 0, 0, 255), MenuElement[i].name);
MenuElement[i].OnClick(i); //内容が描画なのでここに
break;
default: //エラー
DrawFormatString(MenuElement[i].x, MenuElement[i].y, GetColor(255, 0, 0), MenuElement[i].name);
break;
}
}
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
[1.1] 自分が今行いたい事は何か
・マウスで操作できる選択画面を作りたい
・基本的なコードの書き方を知りたい
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
上記
[1.4] 今何がわからないのか、知りたいのか
・メニュー項目が増えるとOnClick()のswitch分が長くなるのが気になるのですが
他に方法があれば教えてほしいです
それぞれの処理用の関数を作って、そちらに飛ばす予定ではあります
・クラスの変数はそれぞれSet関数Get関数を作ってprivateに移動するつもりですが
そうするとGetDrawStringWidth(MenuElement.name, strlen(MenuElement.name))のような部分が
さらに長くなりますがそれでいいのでしょうか?
・コメントの付け方はこんな感じでいいのでしょうか?(コピペ元のも残ってますが)
・コードを他の人に見せるのは初めてなので、他にも気になる点があれば指摘してほしいです
[2] 環境
[2.1] OS : Windows8.1
[2.2] コンパイラ名 :Visual Studio Express 2013 for Windows Desktop
[3] その他
・どの程度C言語を理解しているか
いろいろなサイトの入門編を読んで実践を始めたばかり
新ゲームプログラミングの館は4.4章までと4.7章を読みました
・ライブラリを使っている場合は何を使っているか
DXライブラリ