📄 scoreshow.cpp
字号:
/////////////////////////////////////////////////////////////////////////
//
//显示前十名的ID和分数的类;
//
/////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ScoreShow.h"
////////////////////////////////////////////////////////////////////////
CScoreShow::CScoreShow()
{
m_bActive=true;
m_bSorted=false;//初始状态未排序;
m_bNameGotten=true;//初始状态不需改名字;
m_nChangingItem=0;
int nX=SCREEN_WIDTH,
nY=30,
nPaceX=400,
nPaceY=53,
nSpaceScore=8,
nSpaceName=6;
m_nSpace1=SPIRIT_WIDTH_2*3;//游戏角色头像与分数间隔;head to head;
m_nSpace2=SPIRIT_WIDTH+(SPIRIT_WIDTH_4+nSpaceScore)*10; //分数与游戏者名字间隔;head to head;
RECT rcScore,rcRole;
//初始化记分系统:
rcScore.top =START_Y+SCREEN_HEIGHT+SPIRIT_HEIGHT*7;
rcScore.bottom=rcScore.top+SPIRIT_HEIGHT_2-1;
rcScore.left =START_X;
rcScore.right =rcScore.left+SPIRIT_WIDTH_4-1;;
rcRole.top =START_Y+SCREEN_HEIGHT+SPIRIT_HEIGHT_2*13;
rcRole.bottom=rcRole.top+SPIRIT_HEIGHT_2-1;
rcRole.left =START_X;
rcRole.right =rcRole.left+SPIRIT_WIDTH_2-1;
for(int i=0;i<TOP_TEN;i++)
{
m_nID[i]=0;
m_Role[i].m_nX=nX+i*nPaceX;
m_Role[i].m_nY=nY+i*nPaceY;
m_Role[i].m_nHeight=SPIRIT_HEIGHT_2;
m_Role[i].m_nWidth=SPIRIT_WIDTH_2;
m_ScoreString[i].Initialize(nX+i*nPaceX+m_nSpace1,nY+i*nPaceY,10,nSpaceScore,rcScore);
m_NameString[i].Initialize(nX+i*nPaceX+m_nSpace1+m_nSpace2,nY+i*nPaceY,8,nSpaceName,rcScore);
}
CFile file;
if(file.Open("record.rec",CFile::modeRead))
{
CArchive ar(&file,CArchive::load);
for(int i=0;i<TOP_TEN;i++)
{
int nNum;
CString strWord;
ar>>m_nID[i];
ar>>nNum;
ar>>strWord;
m_ScoreString[i].ArrangeRect(nNum);
m_NameString[i].ArrangeRect(strWord);
//m_NameString[i].ArrangeRect("SHERWOOD");
}
ar.Close();
file.Close();
}
else
{
for(int i=0;i<TOP_TEN;i++)
{
m_nID[i]=0;
m_ScoreString[i].ArrangeRect(0);
m_NameString[i].ArrangeRect("SHERWOOD");
}
}
for(i=0;i<TOP_TEN;i++)
{
m_Role[i].m_rcSource.top =rcRole.top;
m_Role[i].m_rcSource.bottom=rcRole.bottom;
m_Role[i].m_rcSource.left =rcRole.left+m_nID[i]*m_Role[i].m_nWidth;
m_Role[i].m_rcSource.right =m_Role[i].m_rcSource.left+m_Role[i].m_nWidth;
}
}
//////////////////////////////////////////////////////////////////////////
void CScoreShow::Trace()
{
int nPace=40;//这个数一定要被起点与终点的距离整除,否则各行不能对齐;
int nEnd=60;
int nSX,nSY,nNX,nNY;
for(int i=0;i<TOP_TEN;i++)
{
if(m_Role[i].m_nX>nEnd)m_Role[i].m_nX-=nPace;
nSX=m_ScoreString[i].GetShowX();
nSY=m_ScoreString[i].GetShowY();
if(nSX>nEnd+m_nSpace1)m_ScoreString[i].SetShowPosition(nSX-=nPace,nSY);
nNX=m_NameString[i].GetShowX();
nNY=m_NameString[i].GetShowY();
if(nNX>nEnd+m_nSpace1+m_nSpace2)m_NameString[i].SetShowPosition(nNX-=nPace,nNY);
}
return;
}
bool CScoreShow::Show(CDD* pDD)
{
for(int i=0;i<TOP_TEN;i++)
{
//画字符:
//if(m_Role[i].m_bActive)
if(!pDD->BlitSourceToBack(m_Role[i].m_nX,
m_Role[i].m_nY,
m_Role[i].m_rcSource,
DDBLTFAST_SRCCOLORKEY))return false;
if(!m_ScoreString[i].Show(pDD))return false;
if(!m_NameString[i].Show(pDD))return false;
}
return true;
}
//////////////////////////////////////////////////////////////////////////////////////////////
void CScoreShow::Sort(int nScore,int nID)
{
if(!m_bSorted)
{
RECT rcRole;
rcRole.top =START_Y+SCREEN_HEIGHT+SPIRIT_HEIGHT_2*13;
rcRole.bottom=rcRole.top+SPIRIT_HEIGHT_2-1;
rcRole.left =START_X;
rcRole.right =rcRole.left+SPIRIT_WIDTH_2-1;
for(int i=0;i<TOP_TEN;i++)
{
if(nScore>m_ScoreString[i].GetNumber())
{
m_nChangingItem=i;
m_bNameGotten=false;//需要改名字了;
//移动:
for(int j=TOP_TEN-1;j>m_nChangingItem;j--)
{
m_nID[j]=m_nID[j-1];
m_ScoreString[j].ArrangeRect(m_ScoreString[j-1].GetNumber());
m_NameString[j].ArrangeRect(m_NameString[j-1].GetWords());
}
m_nID[m_nChangingItem]=nID;
for(j=TOP_TEN-1;j>m_nChangingItem-1;j--)
{
m_Role[j].m_rcSource.top =rcRole.top;
m_Role[j].m_rcSource.bottom=rcRole.bottom;
m_Role[j].m_rcSource.left =rcRole.left+m_nID[j]*m_Role[j].m_nWidth;
m_Role[j].m_rcSource.right =m_Role[j].m_rcSource.left+m_Role[j].m_nWidth;
}
m_ScoreString[m_nChangingItem].ArrangeRect(nScore);
char cFlashing='Z'+1;
CString cTemp=cFlashing;
m_NameString[m_nChangingItem].ArrangeRect(cTemp);
break;
}
}
m_bSorted=true;
}
return;
}
////////////////////////////////////////////////////////////////////////////////
void CScoreShow::GetName(long unsigned int luTime,CDI* pDI)
{
static int nCurrent=0;
static CString cTemp;
if(m_bSorted&&(!m_bNameGotten)&&(luTime%8==0))//(luTime%8==0)是为了降低输入灵敏度;
{
if(pDI->m_bKeyDown[DIK_A])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+0);
cTemp+="A";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_B])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+1);
cTemp+="B";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_C])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+2);
cTemp+="C";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_D])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+3);
cTemp+="D";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_E])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+4);
cTemp+="E";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_F])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+5);
cTemp+="F";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_G])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+6);
cTemp+="G";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_H])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+7);
cTemp+="H";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_I])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+8);
cTemp+="I";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_J])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+9);
cTemp+="J";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_K])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+10);
cTemp+="K";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_L])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+11);
cTemp+="L";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_M])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+12);
cTemp+="M";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_N])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+13);
cTemp+="N";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_O])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+14);
cTemp+="O";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_P])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+15);
cTemp+="P";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_Q])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+16);
cTemp+="Q";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_R])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+17);
cTemp+="R";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_S])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+18);
cTemp+="S";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_T])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+19);
cTemp+="T";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_U])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+20);
cTemp+="U";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_V])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+21);
cTemp+="V";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_W])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+22);
cTemp+="W";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_X])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+23);
cTemp+="X";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_Y])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+24);
cTemp+="Y";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_Z])
{
m_NameString[m_nChangingItem].SetRect(nCurrent,10+25);
cTemp+="Z";
nCurrent++;
}
if(pDI->m_bKeyDown[DIK_BACKSPACE]&&nCurrent>0)
{
nCurrent--;
//cTemp.Delete(cTemp.GetLength()-1);//VC6.0
//cTemp.GetBufferSetLength(cTemp.GetLength()-1);//VC5.0
cTemp.GetBufferSetLength(nCurrent);//Best;
m_NameString[m_nChangingItem].SetRect(nCurrent+1,10+28);
}
//闪烁光标:
//if(nCurrent<m_NameString[m_nChangingItem].m_nLength-1)
if(cTemp.GetLength()<m_NameString[m_nChangingItem].m_nLength)
{
if(luTime%30<15)m_NameString[m_nChangingItem].SetRect(nCurrent,10+26);
else m_NameString[m_nChangingItem].SetRect(nCurrent,10+28);
}
if(pDI->m_bKeyDown[DIK_RETURN])
{
if(nCurrent==0)m_NameString[m_nChangingItem].ArrangeRect("UNKNOWN");
else m_NameString[m_nChangingItem].ArrangeRect(cTemp);
cTemp.Empty();
nCurrent=0;//这很重要,静态变量归零;
m_bNameGotten=true;
Save();
return;
}
//控制光标位置:
if(nCurrent>m_NameString[m_nChangingItem].m_nLength)
nCurrent=m_NameString[m_nChangingItem].m_nLength;
//nCurrent=nCurrent%(m_NameString[m_nChangingItem].m_nLength);
}
//if(pDI->m_bKeyDown[DIK_ESCAPE])m_bChanged=true;
return;
}
////////////////////////////////////////////////////////////////////////////////
void CScoreShow::Save()
{
CFile file("record.rec",CFile::modeCreate|CFile::modeWrite);
CArchive ar(&file,CArchive::store);
for(int i=0;i<TOP_TEN;i++)
{
ar<<m_nID[i];
ar<<m_ScoreString[i].GetNumber();
ar<<m_NameString[i].GetWords();
}
ar.Close();
file.Close();
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -