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

📄 menu.cpp

📁 一个3D的保龄球的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// Menu.cpp: implementation of the CMenu class.
//
//////////////////////////////////////////////////////////////////////

#include "Menu.h"
#include "..\System\font.h"
#include "..\System\keyinput.h"
#include "DataManager.h"
#include "..\System\sound.h"
#include "..\system\imath.h"
#include "cscene.h"
#include "..\system\network.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMenu::CMenu(CEngine *pEngine, CDataManager *pDataManager)
{
	m_pEngine = pEngine;
	m_pGame = NULL;
	m_pInput = m_pEngine->GetInput();
	m_pDataManager = pDataManager;
	m_bSelected = m_iActAnim = m_iRotAnim3 = 0;
	m_lastplayer = -1;
	m_player = m_mmAnim = m_psAnim = m_opAnim = m_mminAnim = 0;
}

void CMenu::Init()
{
	MEMSET(m_nSel, 0, MENUSTATECOUNT * 4);
	MEMSET(m_nCount, 0, MENUSTATECOUNT * 4);

	// init var
	m_nCount[STATE_PREGAME] = 4;
	m_nCount[STATE_LANESELECT]=m_pDataManager->GetBgCount();
#ifdef ONLINE
	m_nCount[STATE_MAINMENU]=9;
#else
	m_nCount[STATE_MAINMENU]=8;
#endif
	m_nCount[STATE_QUICKMODE]=3;
	m_nCount[STATE_STORYMODE]=2;
	m_nCount[STATE_FREEMODE]=3;
	m_nCount[STATE_ONLINEMODE]=3;
	m_nCount[STATE_BONUSMODE]=2;
	m_nCount[STATE_OPTION]=4;
	m_nCount[STATE_BONUSSELECT]=30;
	m_nCount[STATE_YESNO]=2;
	m_nCount[STATE_RIVALSELECT]=2;
	m_nCount[STATE_PAUSE]=6;
	m_nCount[STATE_HELP]=3;
	m_nCount[STATE_CREDIT]=1;
	m_nCount[STATE_RANKING]=3;
	m_nCount[STATE_CLOTHSELECTA] = m_nCount[STATE_CLOTHSELECTB] = 3;
	m_nCount[STATE_PLAYERSELECTA] = m_nCount[STATE_PLAYERSELECTB] = m_pDataManager->GetPlayerCount();
	m_nCount[STATE_BALLSELECTA] = m_nCount[STATE_BALLSELECTB] = m_pDataManager->GetBallCount();
	m_nCount[STATE_ICONSELECTA] = m_nCount[STATE_ICONSELECTB] = ICON_COUNT;

	int i, j;
	// init strings
	m_cItemString[STATE_MAINMENU][0] = m_pDataManager->m_pStringItem[ID_STATE_MAINMENU_QUICKMODE];
#ifdef ONLINE
	m_cItemString[STATE_MAINMENU][1] = m_pDataManager->m_pStringItem[ID_STATE_MAINMENU_ONLINEMODE];
	i=2;
#else
	i=1;
#endif
	m_cItemString[STATE_MAINMENU][i++] = m_pDataManager->m_pStringItem[ID_STATE_MAINMENU_STORYMODE];
	m_cItemString[STATE_MAINMENU][i++] = m_pDataManager->m_pStringItem[ID_STATE_MAINMENU_FREEMODE];
	m_cItemString[STATE_MAINMENU][i++] = m_pDataManager->m_pStringItem[ID_STATE_MAINMENU_BONUSGAME];
	m_cItemString[STATE_MAINMENU][i++] = m_pDataManager->m_pStringItem[ID_STATE_MAINMENU_OPTION];
	m_cItemString[STATE_MAINMENU][i++] = m_pDataManager->m_pStringItem[ID_STATE_MAINMENU_HELP];
	m_cItemString[STATE_MAINMENU][i++] = m_pDataManager->m_pStringItem[ID_STATE_MAINMENU_ABOUT];
	m_cItemString[STATE_MAINMENU][i++] = m_pDataManager->m_pStringItem[ID_STATE_MAINMENU_EXIT];

	m_cItemString[STATE_QUICKMODE][0] = m_pDataManager->m_pStringItem[ID_STATE_QUICKMODE_PLAY];
	m_cItemString[STATE_QUICKMODE][1] = m_pDataManager->m_pStringItem[ID_STATE_QUICKMODE_VSCOM];
	m_cItemString[STATE_QUICKMODE][2] = m_pDataManager->m_pStringItem[ID_STATE_QUICKMODE_VSHUMAN];

	m_cItemString[STATE_STORYMODE][0] = m_pDataManager->m_pStringItem[ID_STATE_STORYMODE_NEW];
	m_cItemString[STATE_STORYMODE][1] = m_pDataManager->m_pStringItem[ID_STATE_STORYMODE_CONTINUE];

	m_cItemString[STATE_FREEMODE][0] = m_pDataManager->m_pStringItem[ID_STATE_FREEMODE_PLAY];
	m_cItemString[STATE_FREEMODE][1] = m_pDataManager->m_pStringItem[ID_STATE_FREEMODE_VSCOM];
	m_cItemString[STATE_FREEMODE][2] = m_pDataManager->m_pStringItem[ID_STATE_FREEMODE_VSHUMAN];

	m_cItemString[STATE_ONLINEMODE][0] = m_pDataManager->m_pStringItem[ID_STATE_ONLINEMODE_LOGIN];
	m_cItemString[STATE_ONLINEMODE][1] = m_pDataManager->m_pStringItem[ID_STATE_ONLINEMODE_RANK];
	m_cItemString[STATE_ONLINEMODE][2] = m_pDataManager->m_pStringItem[ID_STATE_ONLINEMODE_RESET];

	m_cItemString[STATE_BONUSMODE][0] = m_pDataManager->m_pStringItem[ID_STATE_BONUSMODE_GAME];
	m_cItemString[STATE_BONUSMODE][1] = m_pDataManager->m_pStringItem[ID_STATE_BONUSMODE_CAMERA];

	m_cItemString[STATE_OPTION][0] = m_pDataManager->m_pStringItem[ID_STATE_OPTION_SOUND];
	m_cItemString[STATE_OPTION][1] = m_pDataManager->m_pStringItem[ID_STATE_OPTION_VIBRATE];
	m_cItemString[STATE_OPTION][2] = m_pDataManager->m_pStringItem[ID_STATE_OPTION_HINT];
	m_cItemString[STATE_OPTION][3] = m_pDataManager->m_pStringItem[ID_STATE_OPTION_VOICE];

	m_cItemString[STATE_YESNO][0] = m_pDataManager->m_pStringItem[ID_STATE_YESNO_YES];
	m_cItemString[STATE_YESNO][1] = m_pDataManager->m_pStringItem[ID_STATE_YESNO_NO];

	m_cItemString[STATE_RIVALSELECT][0] = m_pDataManager->m_pStringItem[ID_STATE_YESNO_YES];
	m_cItemString[STATE_RIVALSELECT][1] = m_pDataManager->m_pStringItem[ID_STATE_YESNO_NO];

	m_cItemString[STATE_PAUSE][0] = m_pDataManager->m_pStringItem[ID_STATE_PAUSE_RESUME];
	m_cItemString[STATE_PAUSE][1] = m_pDataManager->m_pStringItem[ID_STATE_PAUSE_OPTION];
	m_cItemString[STATE_PAUSE][2] = m_pDataManager->m_pStringItem[ID_STATE_PAUSE_HELP];
	m_cItemString[STATE_PAUSE][3] = m_pDataManager->m_pStringItem[ID_STATE_PAUSE_VIEWSCORE];
	m_cItemString[STATE_PAUSE][4] = m_pDataManager->m_pStringItem[ID_STATE_PAUSE_SAVE];
	m_cItemString[STATE_PAUSE][5] = m_pDataManager->m_pStringItem[ID_STATE_PAUSE_MAINMENU];

	m_cItemString[STATE_HELP][0] = m_pDataManager->m_pStringItem[ID_STATE_HELP_TITLE];
	m_cItemString[STATE_CREDIT][0] = m_pDataManager->m_pStringItem[ID_STATE_CREDIT_TITLE];

	j = ID_BALL_DESC1;
	for (i=0; i<6; i++)
		m_strBallDescA[i] = m_pDataManager->m_pStringItem[j+i];
	m_strBallDescNA = m_pDataManager->m_pStringItem[ID_BALL_DESCNA];
	j=ID_ICON_DESC1;
	for (i=0; i<8; i++)
		m_strIconDesc[i] = m_pDataManager->m_pStringItem[j+i];
	m_strPlayerDescNA = m_pDataManager->m_pStringItem[ID_PLAYER_DESCNA];
	m_strBonusDescNA = m_pDataManager->m_pStringItem[ID_BONUS_DESCNA];
	j=ID_HELP_MENU_1;
	for (i=0; i<9; i++)
		m_strHelpString[0][i] = m_pDataManager->m_pStringItem[j++];
	m_strHelpString[0][9] = NULL;
	for (i=0; i<10; i++)
		m_strHelpString[1][i] = m_pDataManager->m_pStringItem[j++];
	m_strHelpString[1][10] = NULL;
	for (i=0; i<10; i++)
		m_strHelpString[2][i] = m_pDataManager->m_pStringItem[j++];
	m_strHelpString[2][10] = NULL;
	j=ID_ABOUT1;
	for (i=0; i<71; i++)
		m_strAboutString[i] = m_pDataManager->m_pStringItem[j++];
	m_strAboutString[71] = NULL;


	for (i=0; i<m_nCount[STATE_BALLSELECTA]; i++)
		m_iRotAnim[i] = 0;
	for (i=0; i<m_nCount[STATE_ICONSELECTA]; i++)
		m_iRotAnim2[i] = 512;

	for(i=0;i<m_nCount[STATE_PLAYERSELECTA];i++)
		m_cItemString[STATE_PLAYERSELECTA][i] = m_pDataManager->m_pPlayer[i].name;

	for(i=0;i<m_nCount[STATE_PLAYERSELECTB];i++)
		m_cItemString[STATE_PLAYERSELECTB][i] = m_pDataManager->m_pPlayer[i].name;

	for(i=0;i<m_nCount[STATE_BALLSELECTA];i++)
		m_cItemString[STATE_BALLSELECTA][i] = m_pDataManager->m_pBallName[i];

	for(i=0;i<m_nCount[STATE_BALLSELECTB];i++)
		m_cItemString[STATE_BALLSELECTB][i] = m_pDataManager->m_pBallName[i];

	for(i=0;i<m_nCount[STATE_LANESELECT];i++)
		m_cItemString[STATE_LANESELECT][i] = m_pDataManager->GetBgInfo(i)->name;
	m_WindDur = 0;
	m_bnx = m_bny = 0;
	for (i=0; i<5; i++)
		m_bngames[i] = 4+i;
	for (i=0; i<10; i++)
		m_icontex[i].m_pData = NULL;
	for (i=0; i<sizeof(m_strName); i++)
		m_strName[i] = 0;

	m_iIsCheat = 0;
}

void CMenu::Draw()
{
	int i, j, x, y;
	int s = GetState();
	int byesno = false;
	char str[50];
	MENUSTATE mainsel[9] = 
	{
		STATE_QUICKMODE,
		STATE_ONLINEMODE,
		STATE_STORYMODE,
		STATE_FREEMODE,
		STATE_BONUSMODE,
		STATE_OPTION,
		STATE_HELP,
		STATE_CREDIT,
		STATE_YESNO,
	};

	if (!m_pGame)
		m_pGame = (CGame*)m_pEngine->m_pGame;
	// draw background first
	if (s == STATE_YESNO)	{
		byesno = true;
		m_iState ^= 1<<s;
		s = GetState();
	}
	switch(s)	{
	case STATE_PREGAME:
		switch (m_nSel[s])	{
		case 0:
			m_pEngine->GetGfx()->FillRec(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0x0000);
			m_pUI->DrawGameloft();
			break;
		case 2:
			m_pEngine->GetGfx()->FillRec(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0x0000);
			m_pUI->DrawLButton(2);
			m_pUI->DrawRButton(2);
			m_pUI->DrawMenuString(SCREEN_WIDTH/2, SCREEN_HEIGHT/2-45, "Not enough space to", 1);
			m_pUI->DrawMenuString(SCREEN_WIDTH/2, SCREEN_HEIGHT/2-30, "save. Please free more", 1);
			m_pUI->DrawMenuString(SCREEN_WIDTH/2, SCREEN_HEIGHT/2-15, "space and try again.", 1);
			m_pUI->DrawMenuString(SCREEN_WIDTH/2, SCREEN_HEIGHT/2, "the game will continue ", 1);
			m_pUI->DrawMenuString(SCREEN_WIDTH/2, SCREEN_HEIGHT/2+15, "with the saving disabled.", 1);
			m_pUI->DrawMenuString(SCREEN_WIDTH/2, SCREEN_HEIGHT/2+30, "do you really want", 1);
			m_pUI->DrawMenuString(SCREEN_WIDTH/2, SCREEN_HEIGHT/2+45, "to continue?", 1);
			break;
		case 1:
			m_pUI->DrawMenuBg(-1);
			m_pUI->DrawLButton(2);
			m_pUI->DrawRButton(2);
			m_pUI->DrawMenuString(SCREEN_WIDTH/2, SCREEN_HEIGHT-25, m_pDataManager->m_pStringItem[ID_STATE_PREGAME_SOUND], 1, 0, 0);
			break;
		case 4:
			m_pEngine->GetGfx()->FillRec(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0x0000);
			m_pUI->DrawMenuBg(0);
			++m_iActAnim;
			if (m_iActAnim%30 > 10)
				m_pUI->DrawMenuString(SCREEN_WIDTH/2, SCREEN_HEIGHT-25, m_pDataManager->m_pStringItem[ID_STATE_PREGAME_SPLASH], 1);
			break;
		}
		break;
	case STATE_HELP:
		m_pUI->DrawMenuBg(2);
		m_pUI->DrawLButton(3);
		m_pUI->GetGfx()->DrawColorMask(MAKERGB(128, 128, 128), 0, 0, 12, SCREEN_WIDTH, SCREEN_HEIGHT-24);
		m_pUI->DrawMenuString(SCREEN_WIDTH-2, 2, m_pDataManager->m_pStringItem[ID_STATE_HELP_TITLE], 2);
		i=0;
		y=23;
		m_pUI->DrawMenuString(SCREEN_WIDTH/2, y, m_strHelpString[m_nSel[s]][i], 1, 1, 1);
		y+=26;
		i++;
/*		
		while (i<m_nCount[s])	{
				if (m_mminAnim-i*2 > MMANIMFRAME)
					m_pUI->DrawMenuString(10,y, m_cItemString[s][i], 0, 1);
				else
					m_pUI->DrawMenuString(10+pos[m_mminAnim>i*2?MMANIMFRAME-m_mminAnim+i*2:MMANIMFRAME],y, m_cItemString[s][i], 0, 1);
			i++;
			y+=13;
		}
*/
		{
			int pos[7] = {0, 1, 3, 9, 27, 81, 200};
			int fl;
			m_iSelAnim++;
			if (m_iLastItem == (m_nSel[s]+1)%m_nCount[s])
				fl = -1;
			else
				fl = 1;
			while (m_strHelpString[m_iLastItem][i])	{
				if (m_iSelAnim-i <= 6)
					m_pUI->DrawMenuString(SCREEN_WIDTH/2+fl*(m_iSelAnim-i>0?pos[m_iSelAnim-i]:0), y, m_strHelpString[m_iLastItem][i], 1);
				i++;
				y+= 13;
			}
			i=1;
			y = 49;
			while (m_strHelpString[m_nSel[s]][i])	{
				if (m_iSelAnim-i >= 7)
					m_pUI->DrawMenuString(SCREEN_WIDTH/2-fl*(m_iSelAnim-i>=14?0:pos[13-m_iSelAnim+i]), y, m_strHelpString[m_nSel[s]][i], 1);
				i++;
				y+= 13;
			}
		}
		break;
	case STATE_CREDIT:
		m_pUI->DrawMenuBg(1);
		m_nSel[s] += 1;
		i = (m_nSel[s]/13)%(71+10);
		y = -m_nSel[s]%13;
		while (y<SCREEN_HEIGHT)	{
			if (i<71)
				m_pUI->DrawMenuString(SCREEN_WIDTH/2, y, m_strAboutString[i], 1);
			y+= 13;
			i = (++i)%(71+10);
		}
		m_pUI->GetGfx()->FillRec(0, 0, SCREEN_WIDTH, 12, 0);
		m_pUI->GetGfx()->FillRec(20, 191, SCREEN_WIDTH-40, SCREEN_HEIGHT-191, 0);
		m_pUI->DrawMenuString(SCREEN_WIDTH-2, 2, m_pDataManager->m_pStringItem[ID_STATE_CREDIT_TITLE], 2);
		m_pUI->DrawLButton(3);
		break;
	case STATE_PAUSE:
		if (CheckState(STATE_BONUSMODE))	{
			m_nCount[s] = 4;
			m_cItemString[s][3] = m_cItemString[s][5];
		}	else	{
			m_cItemString[s][3] = m_pDataManager->m_pStringItem[ID_STATE_PAUSE_VIEWSCORE];
			if (!(CheckState(STATE_STORYMODE) && ((CGame*)m_pEngine->m_pGame)->m_saveFlag <= 0))	{
				m_nCount[s] = 5;
				m_cItemString[s][4] = m_cItemString[s][5];
			}	else	{
				m_nCount[s] = 6;
				m_cItemString[s][4] = m_pDataManager->m_pStringItem[ID_STATE_PAUSE_SAVE];
			}
		}
		i=0;
		y=36;
		m_pUI->DrawMenuBg(1);
		m_pUI->DrawLButton(3);
		m_pUI->DrawRButton(3);
		m_pUI->PauseBg(y, m_nCount[s], m_nSel[s], m_psAnim++);
		m_pUI->DrawMenuString(SCREEN_WIDTH-2, 2, m_pDataManager->m_pStringItem[ID_STATE_PAUSE_TITLE], 2);
		while (i<m_nCount[s])	{
			if (i==m_nSel[s])	{
				y += 7;
				m_pUI->DrawMenuString(SCREEN_WIDTH/2,y, m_cItemString[s][i], 1, 0);
				y += 7;
			}	else
				m_pUI->DrawMenuString(SCREEN_WIDTH/2,y, m_cItemString[s][i], 1, 1);
			i++;
			y+=13;
		}
		break;
	case STATE_MAINMENU:
		m_pDataManager->GetRender3D()->StartRender3D();
		m_pUI->DrawMenuBg(1);
		i=0;
		y=36;
		m_pUI->MainMenuAnim(y, m_nSel[s], m_nCount[s], m_mmAnim++);
		m_pUI->DrawRButton(3);
		m_pUI->DrawMenuString(SCREEN_WIDTH-2, 2, m_pDataManager->m_pStringItem[ID_STATE_MAINMENU_TITLE], 2);
		m_mminAnim++;
		{
			int pos[MMANIMFRAME+1] = {0, 1, 3, 7, 15, 31, 63, 127, 171};
			while (i<m_nCount[s])	{
				if (i==m_nSel[s])	{
					y += 7;
					if (m_mminAnim-i*2 > MMANIMFRAME)
						m_pUI->DrawMenuString(10,y, m_cItemString[s][i], 0, 0);
					else
						m_pUI->DrawMenuString(10+pos[m_mminAnim>i*2?MMANIMFRAME-m_mminAnim+i*2:MMANIMFRAME],y, m_cItemString[s][i], 0, 0);
					if (((m_nSel[s] == 1) || (m_nSel[s] == 2) || (m_nSel[s] == 3)
#ifdef ONLINE
						|| (m_nSel[s] == 4)
#endif
						) && m_mminAnim > MMANIMFRAME*3)
						m_pUI->MainMenuArrow(85, y-1);
					y += 7;
				}	else
					if (m_mminAnim-i*2 > MMANIMFRAME)
						m_pUI->DrawMenuString(10,y, m_cItemString[s][i], 0, 1);
					else
						m_pUI->DrawMenuString(10+pos[m_mminAnim>i*2?MMANIMFRAME-m_mminAnim+i*2:MMANIMFRAME],y, m_cItemString[s][i], 0, 1);
				i++;
				y+=13;
			}
		}
		DrawPlayer(m_player, PLAYER_ANI_FOR_SELECT, 0);
		break;
	case STATE_QUICKMODE:
		break;
	case STATE_STORYMODE:
	case STATE_FREEMODE:
	case STATE_BONUSMODE:
	case STATE_ONLINEMODE:
		m_pDataManager->GetRender3D()->StartRender3D();
		m_pUI->DrawMenuBg(1);
		i=0;
		y=36;
		if (m_pGame->m_SaveCanContinue && ((CGame *)m_pEngine->m_pGame)->m_saveFlag <= 0)
			m_nCount[STATE_STORYMODE] = 2;
		else
			m_nCount[STATE_STORYMODE] = 1;
		m_pUI->MainMenuAnim(y, m_nSel[STATE_MAINMENU], m_nCount[STATE_MAINMENU], m_mmAnim++);
		m_pUI->DrawLButton(3);
		m_pUI->DrawRButton(3);
		m_pUI->DrawMenuString(SCREEN_WIDTH-2, 2, m_pDataManager->m_pStringItem[ID_STATE_MAINMENU_TITLE], 2);
		while (i<m_nCount[STATE_MAINMENU])	{
			if (i==m_nSel[STATE_MAINMENU])	{
				y += 7;
				j=y;
				m_pUI->DrawMenuString(10,y, m_cItemString[STATE_MAINMENU][i], 0, 0);
				y += 7;
			}	else
				m_pUI->DrawMenuString(10,y, m_cItemString[STATE_MAINMENU][i], 0, 1);
			i++;
			y+=13;
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -