⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamemenu.cpp

📁 MUD文字游戏开发
💻 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 + -