📄 gamemenu.cpp
字号:
#include "GameMenu.h"
#include <Windows.h>
#include <iostream>
#include <conio.h>
#include "GameMain.h"
#include "GlobalDef.h"
#include "Input.h"
#include "GameMap.h"
//using namespace std;
CGameMenu::CGameMenu(void)
{
//m_hOut=GetStdHandle(STD_OUTPUT_HANDLE); //获取输出句柄
//GetConsoleScreenBufferInfo(m_hOut, &m_bInfo); // 获取窗口缓冲区信息
//m_hIn=GetStdHandle(STD_INPUT_HANDLE); //获取输入句柄
m_nSelect = 0; //选中的菜单(0:开始;1:载入;2:选项;3:退出;)
m_nMenuNum = 0; //记录菜单数量
m_nCursorState = 0; //当前菜单的选中位置,开始菜单为0
m_bRunMenu = true; //判断游戏是在运行菜单画面还是其他画面(true:菜单;false:非菜单)
m_bDrawMenu = true; //判断是否要重新获取菜单(true:重画;false:不用重画)
m_dwKeyBuffer = 0;
m_pInterface = new CInterface();
}
CGameMenu::~CGameMenu(void)
{
//CloseHandle(m_hOut);
//CloseHandle(m_hIn);
}
//画出游戏菜单
void CGameMenu::GetMenu()
{
DrawMenuValue("WORD GAME - 冰火之旅",-1); //游戏标题
DrawMenuValue("风起云涌",0); //游戏开始
DrawMenuValue("重提往事",1); //游戏载入
DrawMenuValue("随心所欲",2); //选项
DrawMenuValue("隐退江湖",3); //退出
}
//画出菜单各成员项
void CGameMenu::DrawMenuValue(char *strValue,int nSelect)
{
COORD tempPos;
int nNum = static_cast<int>(strlen(strValue));
if (nSelect == -1) //记录游戏标题的位置
{
//tempPos.X = (m_bInfo.dwSize.X-nNum)/2-1;
//tempPos.Y = m_bInfo.dwSize.Y/2-5;
tempPos.X = (SCREENWIDTH-nNum)/2-1;
tempPos.Y = SCREENHEIGHT/2-5;
}
else //记录游戏选项的位置
{
//tempPos.X = (m_bInfo.dwSize.X-nNum)/2-1;
//tempPos.Y = m_bInfo.dwSize.Y/2+nSelect;
tempPos.X = (SCREENWIDTH-nNum)/2-1;
tempPos.Y = SCREENHEIGHT/2+nSelect;
++m_nMenuNum;//记录菜单个数
}
if (nSelect == 0)
{
m_coMenuPos = tempPos;//记录下游戏开始的位置
}
//WriteConsoleOutputCharacter(m_hOut,strValue,nNum,tempPos,NULL);
WriteConsoleOutputCharacter(CInput::getHout(),strValue,nNum,tempPos,NULL);
}
//选中的菜单时,菜单要发生变化
void CGameMenu::SelectMenu()
{
INPUT_RECORD irRec;
DWORD dwRes;
bool bDoubleClick;
while (m_bRunMenu)
{
if (m_bDrawMenu)
{
//m_pBuildScreen->CreateNewScreen();
GetMenu();//画出游戏菜单
DrawCursor(); //默认选中游戏开始菜单
m_bDrawMenu = false;//菜单在必要的时候画一次就可以了
}
ReadConsoleInput(CInput::getHin(), &irRec, 1, &dwRes);//从控制台读取相关数据
if (irRec.EventType == KEY_EVENT)
{
m_dwKeyBuffer = irRec.Event.KeyEvent.wVirtualKeyCode;
KeyEvent();
//DrawCursor(); //显示当前游戏菜单的选中状态
//_getch(); //控制光标跳转两行的清空
}
if (irRec.EventType == MOUSE_EVENT) //判断是不是进行了鼠标操作
{
m_dwKeyBuffer = irRec.Event.MouseEvent.dwButtonState;
m_coMousePos = irRec.Event.MouseEvent.dwMousePosition;
//判断是否双击鼠标
bDoubleClick = false;
if (irRec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)
{
bDoubleClick = true;
}
MouseEvent(bDoubleClick);
//DrawCursor();//显示当前游戏菜单的选中状态
}
}
}
//响应键盘事件
void CGameMenu::KeyEvent()
{
//当键盘改变的时候记录下当前选中行
if(m_dwKeyBuffer == VK_UP)//向上
{
if(m_nSelect != 0)//指向第一个菜单的时候,不做改变
{
--m_nSelect;
Beep(1760,10);
CleanCursor();//清除非选中菜单的选中状态
DrawCursor(); //显示当前游戏菜单的选中状态
}
_getch(); //控制光标跳转两行的清空
}
if(m_dwKeyBuffer == VK_DOWN)//向下
{
if(m_nSelect != (m_nMenuNum-1))//指向最后一个菜单的时候,不做改变
{
++m_nSelect;
Beep(1760,10);
CleanCursor();//清除非选中菜单的选中状态
DrawCursor(); //显示当前游戏菜单的选中状态
}
_getch(); //控制光标跳转两行的清空
}
//------游戏开始------
if(m_dwKeyBuffer == VK_RETURN)//回车
{
switch(m_nSelect)//(0:开始;1:载入;2:选项;3:退出;)
{
case 0:
//NewPalyer();
GetStartMessage();//获取游戏开始的提示信息
CGameMap::GetInstance()->IntoIceMap();//运行冰原地图
m_bRunMenu = false;
break;
case 1:
system("cls");
CGameMap::GetInstance()->IntoIceMap();//运行冰原地图
m_bRunMenu = false;
break;
case 2:
system("cls");
m_pInterface->ShowMessage(" ★★游戏说明★★",1);
m_pInterface->ShowMessage("→→→→→→→→→→←←←←←←←←←←",2);
m_pInterface->ShowMessage("本意是要模仿暗黑做成半ARPG游戏,",4);
m_pInterface->ShowMessage("----可惜时间太紧效率又低。0o(︶︿︶)o唉",6);
m_pInterface->ShowMessage(" 开发者 → 张泽贤",10);
m_bDrawMenu = true; //菜单需要重新画
m_nMenuNum = 0; //菜单数量为
while(1)
{
int n = _getch();
if(n != 13)
{
system("cls");
break;
}
}
break;
case 3:
m_bRunMenu = false;//退出游戏菜单
GAME.Quit();
break;
}
//_getch(); //控制光标跳转两行的清空
}
}
//响应鼠标事件
void CGameMenu::MouseEvent(bool bDoubleClick)
{
if(m_dwKeyBuffer == FROM_LEFT_1ST_BUTTON_PRESSED)//点击左键
{
COORD tempPos = m_coMousePos;
tempPos.X -= m_coMenuPos.X;
tempPos.Y -= m_coMenuPos.Y;
//把鼠标点击的位置和游戏开始菜单的位置进行比较
if(tempPos.X>=0 && tempPos.Y>=0 && tempPos.X<20 && tempPos.Y<m_nMenuNum)
{
if(m_nSelect != tempPos.Y)
{
m_nSelect = tempPos.Y;
Beep(1760,10);
CleanCursor();//清除非选中菜单的选中状态
DrawCursor(); //显示当前游戏菜单的选中状态
}
}
//------游戏开始-------
if(bDoubleClick)//双击鼠标
{
switch(m_nSelect)//(0:开始;1:载入;2:选项;3:退出;)
{
case 0:
//NewPalyer();
GetStartMessage();//获取游戏开始的提示信息
CGameMap::GetInstance()->IntoIceMap();//运行冰原地图
m_bRunMenu = false;
break;
case 1:
//GAME.NextState();
m_bRunMenu = false;
break;
case 2:
break;
m_bRunMenu = false;
case 3:
m_bRunMenu = false;//退出游戏菜单
break;
}
}
}
}
//清空未选中行的菜单选中符
void CGameMenu::CleanCursor()
{
COORD leftCursorPos;
COORD rightCursorPos;
leftCursorPos.X = m_coMenuPos.X - 6;
rightCursorPos.X = m_coMenuPos.X + 10;
for (int i=0;i<m_nMenuNum;i++)
{
if (i!=m_nSelect)
{
leftCursorPos.Y = m_coMenuPos.Y + i;
rightCursorPos.Y = m_coMenuPos.Y + i;
////清除左边选中状态
//WriteConsoleOutputCharacter(m_hOut," ",4,leftCursorPos,NULL);
////清除右边选中状态
//WriteConsoleOutputCharacter(m_hOut," ",4,rightCursorPos,NULL);
//清除左边选中状态
WriteConsoleOutputCharacter(CInput::getHout()," ",4,leftCursorPos,NULL);
//清除右边选中状态
WriteConsoleOutputCharacter(CInput::getHout()," ",4,rightCursorPos,NULL);
}
}
}
//显示游戏菜单的选中状态
void CGameMenu::DrawCursor()
{
m_nCursorState=0;
//if(m_nCursorState >= 4)
//{
// CleanCursor(m_nSelect);
// m_nCursorState=0;
//}
char *left = ">>>>";
char *right = "<<<<";
COORD leftCursorPos = m_coMenuPos;
COORD rightCursorPos = m_coMenuPos;
leftCursorPos.X -= (6-m_nCursorState);
leftCursorPos.Y += m_nSelect;
rightCursorPos.X += (10-m_nCursorState);
rightCursorPos.Y += m_nSelect;
//WriteConsoleOutputCharacter(m_hOut,left,4,leftCursorPos,NULL);
//WriteConsoleOutputCharacter(m_hOut,right,4,rightCursorPos,NULL);
WriteConsoleOutputCharacter(CInput::getHout(),left,4,leftCursorPos,NULL);
WriteConsoleOutputCharacter(CInput::getHout(),right,4,rightCursorPos,NULL);
//++m_nCursorState;
//Sleep(100);
}
void CGameMenu::GetStartMessage()
{
system("cls");
m_pInterface->ShowMessage(" ★★前言★★",1);
m_pInterface->ShowMessage("-------------------------------------------",2);
m_pInterface->ShowMessage("冰火之魔屠戮了达拉城",3);
m_pInterface->ShowMessage(" ---原本的世外桃源......",4);
m_pInterface->ShowMessage("水深火热的人们等待着",5);
m_pInterface->ShowMessage(" ---英雄的你去拯救......",6);
while(1)
{
_getch();
system("cls");
break;
}
}
void CGameMenu::EnterMap()
{
}
void CGameMenu::GameLoop()
{
}
void CGameMenu::Close()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -