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

📄 scoreshow.cpp

📁 一个完整的2D滚屏游戏示例
💻 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 + -