#3
by あたっしゅ » 1年前
東上☆海美☆「
とりあえず、作ってみたみみ。
コード:
//
// https://dixq.net/forum/viewtopic.php?f=3&t=21545
// マウスカーソル ゲームメニュー選択画面 - ミクプラ(ja)
//
// for Visual Studio 2022
//
#include "DxLib.h"
#include <vector>
#define _USE_MATH_DEFINES
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//
//
//
enum eMenu {
eMenu_Game,
eMenu_Conf,
eMenu_Help,
eMenu_Exit,
eMenu_Num,
};
static int NowSelect = eMenu_Game; //現在の選択状態(初期はゲーム選択中)
const int OX = 280;
const int DX = 100;
const int DX2 = DX/2;
const int DY = 64;
const int DY2 = DY/2;
const int GAME_Y = 100;
const int CONF_Y = GAME_Y + DY*1;
const int HELP_Y = GAME_Y + DY*2;
const int EXIT_Y = GAME_Y + DY*3;
const int Ytable[eMenu_Num] = {
GAME_Y,
CONF_Y,
HELP_Y,
EXIT_Y,
};
enum eScene {
eScene_Game,
eScene_Config,
eScene_Help,
};
static int sceneSelect = eScene_Game;
void
SceneMgr_ChangeScene(enum eScene a )
{
sceneSelect = a;
}
int
Keyboard_Get(int KeyCode )
{
return CheckHitKey(KeyCode);
}
//更新
void
Menu_Update()
{
static int pushed = 0;
int x, y;
int MouseX, MouseY;
int Mouse = GetMouseInput(); //マウスの入力状態取得
int Wheel = GetMouseWheelRotVol(); //ホイールの回転量取得
if (pushed == 0) {
if (Keyboard_Get(KEY_INPUT_DOWN) == 1 || Keyboard_Get(KEY_INPUT_S) == 1 || Wheel < 0) {//下キーが押されているかつホイールが-方向に回転していたら
NowSelect = (NowSelect + 1) % eMenu_Num;//選択状態を一つ下げる
pushed = 10;
}
if (Keyboard_Get(KEY_INPUT_UP) == 1 || Keyboard_Get(KEY_INPUT_W) == 1 || Wheel > 0) {//上キーが押されているかつホイールが+方向に回転していたら
NowSelect = (NowSelect + (eMenu_Num - 1)) % eMenu_Num;//選択状態を一つ上げる
pushed = 10;
}
} else {
pushed--;
}
if ((GetMouseInput() & MOUSE_INPUT_LEFT)) {
GetMousePoint(&MouseX, &MouseY);
for (int i = 0; i < eMenu_Num; i++) {
if (MouseX > OX-20 && MouseX < OX + DX && MouseY > Ytable[i] && MouseY < Ytable[i] + DY2 ) {
NowSelect = i;
}
}
}
if (Keyboard_Get(KEY_INPUT_RETURN) == 1 || (GetMouseInput() & MOUSE_INPUT_LEFT) != 0) {//エンターキーが押されたら
switch (NowSelect) {//現在選択中の状態によって処理を分岐
case eMenu_Game://ゲーム選択中なら
SceneMgr_ChangeScene(eScene_Game);//シーンをゲーム画面に変更
break;
case eMenu_Conf://設定選択中なら
SceneMgr_ChangeScene(eScene_Config);//シーンを設定画面に変更
break;
case eMenu_Help://設定選択中なら
SceneMgr_ChangeScene(eScene_Help);//シーンを設定画面に変更
break;
case eMenu_Exit://やめる選択中なら
DxLib_End();
}
}
}
//描画
void
Menu_Draw()
{
DrawString(180, 60, "メニュー画面", GetColor(255, 255, 255));
DrawString(10, GAME_Y + DY * 4, "※上下キー又はw、s、ホイールを動かし、エンターか左クリックを押して下さい。",
GetColor(255, 255, 255));
DrawString(280, GAME_Y, "ゲーム", GetColor(255, 255, 255));
DrawString(280, CONF_Y, "設定", GetColor(255, 255, 255));
DrawString(280, HELP_Y, "説明", GetColor(255, 255, 255));
DrawString(280, EXIT_Y, "やめる", GetColor(255, 255, 255));
int y = 0;
switch (NowSelect) {//現在の選択状態に従って処理を分岐
case eMenu_Game://ゲーム選択中なら
DrawString( OX, GAME_Y, "ゲーム", GetColor(0, 255, 0));//緑にさせる
y = GAME_Y; //ゲームの座標を格納
break;
case eMenu_Conf://設定選択中なら
DrawString( OX, CONF_Y, "設定", GetColor(0, 255, 0));//緑にさせる
y = CONF_Y; //設定の座標を格納
break;
case eMenu_Help://設定選択中なら
DrawString( OX, HELP_Y, "説明", GetColor(0, 255, 0));//緑にさせる
y = HELP_Y; //説明の座標を格納
break;
case eMenu_Exit://やめる選択中なら
DrawString( OX, EXIT_Y, "やめる", GetColor(0, 255, 0));//緑にさせる
y = EXIT_Y;
}
DrawString(250, y, "■", GetColor(0, 255, 0));//緑の■
}
//
//
//
int WINAPI
WinMain(HINSTANCE, HINSTANCE, LPSTR, int) try
{
srand((unsigned)time(NULL)); // 乱数の仕組みを初期化
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定
// while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
while (
ScreenFlip() == 0
&& ProcessMessage() == 0
&& ClearDrawScreen() == 0
) {
//if (CheckHitKey(KEY_INPUT_ESCAPE)) {
// break;
//}
Menu_Update();
Menu_Draw();
}
DxLib_End(); // DXライブラリ終了処理
return EXIT_SUCCESS;
}
catch(...)
{
return EXIT_FAILURE;
}
// end.
」
東上☆海美☆「
とりあえず、作ってみたみみ。
[code]
//
// https://dixq.net/forum/viewtopic.php?f=3&t=21545
// マウスカーソル ゲームメニュー選択画面 - ミクプラ(ja)
//
// for Visual Studio 2022
//
#include "DxLib.h"
#include <vector>
#define _USE_MATH_DEFINES
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//
//
//
enum eMenu {
eMenu_Game,
eMenu_Conf,
eMenu_Help,
eMenu_Exit,
eMenu_Num,
};
static int NowSelect = eMenu_Game; //現在の選択状態(初期はゲーム選択中)
const int OX = 280;
const int DX = 100;
const int DX2 = DX/2;
const int DY = 64;
const int DY2 = DY/2;
const int GAME_Y = 100;
const int CONF_Y = GAME_Y + DY*1;
const int HELP_Y = GAME_Y + DY*2;
const int EXIT_Y = GAME_Y + DY*3;
const int Ytable[eMenu_Num] = {
GAME_Y,
CONF_Y,
HELP_Y,
EXIT_Y,
};
enum eScene {
eScene_Game,
eScene_Config,
eScene_Help,
};
static int sceneSelect = eScene_Game;
void
SceneMgr_ChangeScene(enum eScene a )
{
sceneSelect = a;
}
int
Keyboard_Get(int KeyCode )
{
return CheckHitKey(KeyCode);
}
//更新
void
Menu_Update()
{
static int pushed = 0;
int x, y;
int MouseX, MouseY;
int Mouse = GetMouseInput(); //マウスの入力状態取得
int Wheel = GetMouseWheelRotVol(); //ホイールの回転量取得
if (pushed == 0) {
if (Keyboard_Get(KEY_INPUT_DOWN) == 1 || Keyboard_Get(KEY_INPUT_S) == 1 || Wheel < 0) {//下キーが押されているかつホイールが-方向に回転していたら
NowSelect = (NowSelect + 1) % eMenu_Num;//選択状態を一つ下げる
pushed = 10;
}
if (Keyboard_Get(KEY_INPUT_UP) == 1 || Keyboard_Get(KEY_INPUT_W) == 1 || Wheel > 0) {//上キーが押されているかつホイールが+方向に回転していたら
NowSelect = (NowSelect + (eMenu_Num - 1)) % eMenu_Num;//選択状態を一つ上げる
pushed = 10;
}
} else {
pushed--;
}
if ((GetMouseInput() & MOUSE_INPUT_LEFT)) {
GetMousePoint(&MouseX, &MouseY);
for (int i = 0; i < eMenu_Num; i++) {
if (MouseX > OX-20 && MouseX < OX + DX && MouseY > Ytable[i] && MouseY < Ytable[i] + DY2 ) {
NowSelect = i;
}
}
}
if (Keyboard_Get(KEY_INPUT_RETURN) == 1 || (GetMouseInput() & MOUSE_INPUT_LEFT) != 0) {//エンターキーが押されたら
switch (NowSelect) {//現在選択中の状態によって処理を分岐
case eMenu_Game://ゲーム選択中なら
SceneMgr_ChangeScene(eScene_Game);//シーンをゲーム画面に変更
break;
case eMenu_Conf://設定選択中なら
SceneMgr_ChangeScene(eScene_Config);//シーンを設定画面に変更
break;
case eMenu_Help://設定選択中なら
SceneMgr_ChangeScene(eScene_Help);//シーンを設定画面に変更
break;
case eMenu_Exit://やめる選択中なら
DxLib_End();
}
}
}
//描画
void
Menu_Draw()
{
DrawString(180, 60, "メニュー画面", GetColor(255, 255, 255));
DrawString(10, GAME_Y + DY * 4, "※上下キー又はw、s、ホイールを動かし、エンターか左クリックを押して下さい。",
GetColor(255, 255, 255));
DrawString(280, GAME_Y, "ゲーム", GetColor(255, 255, 255));
DrawString(280, CONF_Y, "設定", GetColor(255, 255, 255));
DrawString(280, HELP_Y, "説明", GetColor(255, 255, 255));
DrawString(280, EXIT_Y, "やめる", GetColor(255, 255, 255));
int y = 0;
switch (NowSelect) {//現在の選択状態に従って処理を分岐
case eMenu_Game://ゲーム選択中なら
DrawString( OX, GAME_Y, "ゲーム", GetColor(0, 255, 0));//緑にさせる
y = GAME_Y; //ゲームの座標を格納
break;
case eMenu_Conf://設定選択中なら
DrawString( OX, CONF_Y, "設定", GetColor(0, 255, 0));//緑にさせる
y = CONF_Y; //設定の座標を格納
break;
case eMenu_Help://設定選択中なら
DrawString( OX, HELP_Y, "説明", GetColor(0, 255, 0));//緑にさせる
y = HELP_Y; //説明の座標を格納
break;
case eMenu_Exit://やめる選択中なら
DrawString( OX, EXIT_Y, "やめる", GetColor(0, 255, 0));//緑にさせる
y = EXIT_Y;
}
DrawString(250, y, "■", GetColor(0, 255, 0));//緑の■
}
//
//
//
int WINAPI
WinMain(HINSTANCE, HINSTANCE, LPSTR, int) try
{
srand((unsigned)time(NULL)); // 乱数の仕組みを初期化
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定
// while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
while (
ScreenFlip() == 0
&& ProcessMessage() == 0
&& ClearDrawScreen() == 0
) {
//if (CheckHitKey(KEY_INPUT_ESCAPE)) {
// break;
//}
Menu_Update();
Menu_Draw();
}
DxLib_End(); // DXライブラリ終了処理
return EXIT_SUCCESS;
}
catch(...)
{
return EXIT_FAILURE;
}
// end.
[/code]
」