📄 menu.cpp
字号:
// 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 + -