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

📄 stage1st.cpp

📁 一个完整的2D滚屏游戏示例
💻 CPP
字号:
#include "stdafx.h"
#include "Stage1st.h"

//////////////////////////////////////////////////////////////////////////////////////
//CStage1st
//////////////////////////////////////////////////////////////////////////////////////
CStage1st::CStage1st(CDD* pdd,LPCSTR szBitmap,CDI* pdi,CDS* pds,LPCSTR szWaves[DSOUND_MAX_NUM],int nSoundNum)
:CGameStatus(pdd,szBitmap,pdi,pds,szWaves,nSoundNum)
{
RECT rect;

//记分系统初始化:
m_nScorePlayer1=0;
m_nScorePlayer2=0;

rect.top=START_Y+SCREEN_HEIGHT+SPIRIT_HEIGHT_2*9;
rect.bottom=rect.top+SPIRIT_HEIGHT_4-1;
rect.left=START_X;
rect.right=rect.left+SPIRIT_WIDTH_8-1;

m_ScorePlayer1.Initialize(10,5,10,1,rect);
//m_ScorePlayer1.SetShowPosition(10,5);
//
//冰河的初始化:
m_CosmosBingHe.Activate(0,START_Y+SCREEN_HEIGHT+SPIRIT_HEIGHT*4,28);
//石头的初始化:

//沙加的初始化:

rect.top   =START_Y+SCREEN_HEIGHT+SPIRIT_HEIGHT*2+SPIRIT_HEIGHT_4;
rect.bottom=rect.top+SPIRIT_HEIGHT_4-1;
rect.left  =START_X+SPIRIT_WIDTH_4;
rect.right =rect.left+SPIRIT_WIDTH_4-1;
for(int i=0;i<7;i++)
m_ShaJiaFire7[i].Initialize(30,7,rect);

//小敌人3子弹初始化:
rect.top   =START_Y+SCREEN_HEIGHT+SPIRIT_HEIGHT*5;
rect.bottom=rect.top+SPIRIT_HEIGHT_2-1;
rect.left  =START_X+SPIRIT_WIDTH_2*2;
rect.right =rect.left+SPIRIT_WIDTH_4-1;
for(i=0;i<MAX_STONE_COLUMN;i++)
m_SSaint3Fire[i].Initialize(0,0,rect,7777);

//small saint4's fire:
for(i=0;i<3;i++)
m_SSaint4Fire3[i].Initialize(25,3,rect,7777);
}


//////////////////////////////////////////////////////////////////////////////////////
bool CStage1st::Run()
{
//Direct input取得输入状态;
//m_pDI->UpDateInputState();

//声音处理:
	if(m_BingHe.m_bFiring)m_pDS->Play(1,0,0,15000);
	else m_pDS->Stop(1);

int i,j;//循环变量;


	////背景处理;
	if(m_BK.m_bActive)m_BK.Trace(m_luTime,m_PalaceGate);
	if(m_BK.m_bAtPalace)
	{
	m_PalaceGate.m_bActive=true;
	m_PalaceGate.Trace(m_luTime,m_BK);
	//if(m_PalaceGate.m_nX==0)m_BK.m_bActive=false;
	}

    ////分数处理:
	//m_nScorePlayer1++;
    m_ScorePlayer1.ArrangeRect(m_nScorePlayer1);
	//m_ScorePlayer1.ArrangeRect("SHERWOOD");
	
	////石头处理:
	if(m_luTime==350)//&&m_luTime<=2000)
	for(i=0;i<MAX_STONE_COLUMN;i++)
	m_Stone[i].Activate();//m_bActive=true;

	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_Stone[i].m_bActive)
	{
		if(m_Stone[i].m_bAlive)m_Stone[i].Trace(i);
		else
		{ 
		m_Stone[i].DyingTrace(1);
		//m_pDS->Play(2,0,0,15000);
		}
	}
    
	////小敌人处理:
    ////1
	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_luTime==(UINT)(800+i*10))//&&m_luTime<=2000)
		m_SSaint1[i].Activate();//m_bActive=true;

	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_SSaint1[i].m_bActive)
	{
		if(m_SSaint1[i].m_bAlive)m_SSaint1[i].Trace(i);
		else
		{ 
		m_SSaint1[i].DyingTrace(1);
		}
	}
    
	////2
	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_luTime==(UINT)(1050+i*10))//&&m_luTime<=2000)
		m_SSaint2[i].Activate();//m_bActive=true;

	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_SSaint2[i].m_bActive)
	{
		if(m_SSaint2[i].m_bAlive)m_SSaint2[i].Trace(i);
		else
		{ 
		m_SSaint2[i].DyingTrace(1);
		}
	} 
    ////3
    for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_luTime==(UINT)(1250+i*10))//&&m_luTime<=2000)
	m_SSaint3[i].Activate();//m_bActive=true;

	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_SSaint3[i].m_bActive)
	{
		if(m_SSaint3[i].m_bAlive)m_SSaint3[i].Trace(i,m_luTime);
		else
		{ 
		m_SSaint3[i].DyingTrace(1);
		}
	}
    ////小敌人3的子弹:
	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_SSaint3[i].m_bFiring&&m_SSaint3[i].m_bAlive)
	{
		if(!m_SSaint3Fire[i].m_bActive)
		m_SSaint3Fire[i].Activate(m_SSaint3[i]);//激活一个子弹;
	}
	
	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_SSaint3Fire[i].m_bActive)m_SSaint3Fire[i].Trace(0);
	else m_SSaint3Fire[i].m_bActive=false;
    
	////4
	if(m_luTime==(UINT)(1400+i*10))//&&m_luTime<=2000)
	m_SSaint4.Activate();//m_bActive=true;

	//for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_SSaint4.m_bActive)
	{
		if(m_SSaint4.m_bAlive)m_SSaint4.Trace(i,m_luTime);
		else
		{ 
		m_SSaint4.DyingTrace(1);
		}
	}

	//4的子弹:
	if(m_SSaint4.m_bFiring)
	{
	 	for(i=0;i<m_SSaint4Fire3[0].m_nFireNum;i++)
		{
		if(!m_SSaint4Fire3[i].m_bActive)
		m_SSaint4Fire3[i].Activate(m_SSaint4);//激活一个子弹;
		}
	}
	
	for(i=0;i<m_SSaint4Fire3[0].m_nFireNum;i++)
	//if(m_SSaint4.m_bAlive)
	{
	    if(m_SSaint4Fire3[i].m_bActive)m_SSaint4Fire3[i].Trace(i);
	    else m_SSaint4Fire3[i].DyingTrace(1);
	}/*
	else 
	{
	m_SSaint4Fire3[i].m_bActive=false;     
    m_SSaint4Fire3[i].m_bAlive=false;     
    }*/

	////沙加处理:
	////(1)沙加:
	if(m_luTime==1800)
	{
	m_ShaJia.Activate();
	m_CosmosShaJia.Activate(0,START_Y+SCREEN_HEIGHT+SPIRIT_HEIGHT*4+SPIRIT_HEIGHT_4,28+SPIRIT_HEIGHT_4);
	for(i=0;i<LOTUS_NUM;i++)
	m_Lotus[i].InitAngle(i);
	}
	
	if(m_ShaJia.m_bActive)
	{
		if(m_ShaJia.m_bAlive)
		{
		m_ShaJia.Trace(m_luTime,m_BingHe);
	    }
		else
		{ 
		m_ShaJia.DyingTrace(1);
		}
	    m_CosmosShaJia.Trace(m_ShaJia);		
	}
    
	////(2)沙加的5向子弹:
    if(m_ShaJia.m_bFiring)
	{
	 	for(i=0;i<m_ShaJiaFire7[0].m_nFireNum;i++)
		{
		if(!m_ShaJiaFire7[i].m_bActive)
		m_ShaJiaFire7[i].Activate(m_ShaJia);//激活一个子弹;
		}
	}
	
	for(i=0;i<m_ShaJiaFire7[0].m_nFireNum;i++)
	if(m_ShaJia.m_bAlive)
	{
		if(m_ShaJiaFire7[i].m_bActive)m_ShaJiaFire7[i].Trace(i);
	}
	else 
	{
	m_ShaJiaFire7[i].m_bActive=false;     
    m_ShaJiaFire7[i].m_bAlive=false;     
    }

	////(3)沙加的莲花:
	for(i=0;i<LOTUS_NUM;i++)
	if(m_Lotus[i].m_bActive)
	{
		if(m_Lotus[i].m_bAlive&&m_ShaJia.m_bAlive)m_Lotus[i].Trace(m_ShaJia,i);
		else
		{ 
		m_Lotus[i].DyingTrace(1);
		}
	}


	////冰河处理:
	if(m_BingHe.m_bAlive)
	m_BingHe.Trace(m_pDI->m_dwMouse,m_pDI->m_MousePoint,m_pDI->m_bKeyDown,m_luTime);
	else 
	{
	m_BingHe.DyingTrace(1);
	m_BingHe.m_bFiring=false;
	}	
	m_CosmosBingHe.Trace(m_BingHe);

	static int nFBHNum=0;     //记录冰河的子弹编号;
	if(m_BingHe.m_bFiring)
	{
	if(nFBHNum==MAX_FIRE_NUM)nFBHNum=0;
	m_FireBingHe[nFBHNum].Activate(m_BingHe);//激活一个子弹;
	nFBHNum++;
	if(m_BingHe.m_nCosmos>20&&nFBHNum==MAX_FIRE_NUM)m_BingHe.m_nCosmos--;
	}

    for(i=0;i<MAX_FIRE_NUM;i++)
	if(m_BingHe.m_bAlive)
	{
	if(m_FireBingHe[i].m_bActive)
	m_FireBingHe[i].Trace();
	}
	else m_FireBingHe[i].m_bActive=false; 


	////游戏结束语处理:"Game Over"/"Bye Athena"
	if(!m_BingHe.m_bAlive)
	{
	m_GameOverShow.m_bActive=true;
	m_GameOverShow.Trace();
	if(m_GameOverShow.m_bActive==false)return false;
	}
   	////////////////////////////////////////////////////////////////////
	//撞击检测:(可以再另添一个函数单独处理)
	////////////////////////////////////////////////////////////////////
    int nOldCosmos;//记录Spirit在撞击前的Cosmos;
	
	////石头与冰河的子弹:
	for(j=0;j<MAX_STONE_COLUMN;j++)
	{
		if(m_BingHe.Collison(m_Stone[j]))
		{
        nOldCosmos=m_Stone[j].m_nCosmos; 
		m_Stone[j].BeCollided(m_BingHe.m_nCosmos);
		m_BingHe.BeCollided(nOldCosmos);
		}	

		for(i=0;i<MAX_FIRE_NUM;i++)
		if(m_FireBingHe[i].Collison(m_Stone[j]))
		{
		m_Stone[j].BeCollided(m_FireBingHe[i].m_nCosmos);
		m_FireBingHe[i].BeCollided();
		m_BingHe.m_nCosmos++;
		m_nScorePlayer1++;
		//m_pDS->Play(2,0,0,15000);
		}
		//m_pDS->Stop(2);
	}
    ////小敌人和冰河的子弹:
    for(j=0;j<MAX_STONE_COLUMN;j++)
	{   
		////1
		if(m_BingHe.Collison(m_SSaint1[j]))
		{
        nOldCosmos=m_SSaint1[j].m_nCosmos; 
		m_SSaint1[j].BeCollided(m_BingHe.m_nCosmos);
		m_BingHe.BeCollided(nOldCosmos);
		}	

		for(i=0;i<MAX_FIRE_NUM;i++)
		if(m_FireBingHe[i].Collison(m_SSaint1[j]))
		{
		m_SSaint1[j].BeCollided(m_FireBingHe[i].m_nCosmos);
		m_FireBingHe[i].BeCollided();
		m_BingHe.m_nCosmos++;
		m_nScorePlayer1++;
		}
		
		////2
		if(m_BingHe.Collison(m_SSaint2[j]))
		{
        nOldCosmos=m_SSaint2[j].m_nCosmos; 
		m_SSaint2[j].BeCollided(m_BingHe.m_nCosmos);
		m_BingHe.BeCollided(nOldCosmos);
		}	

		for(i=0;i<MAX_FIRE_NUM;i++)
		if(m_FireBingHe[i].Collison(m_SSaint2[j]))
		{
		m_SSaint2[j].BeCollided(m_FireBingHe[i].m_nCosmos);
		m_FireBingHe[i].BeCollided();
		m_BingHe.m_nCosmos++;
		m_nScorePlayer1++;
		}

		////3
		if(m_BingHe.Collison(m_SSaint3[j]))
		{
        nOldCosmos=m_SSaint3[j].m_nCosmos; 
		m_SSaint3[j].BeCollided(m_BingHe.m_nCosmos);
		m_BingHe.BeCollided(nOldCosmos);
		}	

		for(i=0;i<MAX_FIRE_NUM;i++)
		if(m_FireBingHe[i].Collison(m_SSaint3[j]))
		{
		m_SSaint3[j].BeCollided(m_FireBingHe[i].m_nCosmos);
		m_FireBingHe[i].BeCollided();
		m_BingHe.m_nCosmos++;
		m_nScorePlayer1++;
		}

		////3的子弹:
	    if(m_BingHe.Collison(m_SSaint3Fire[j]))
		{
        nOldCosmos=m_SSaint3Fire[j].m_nCosmos; 
		m_SSaint3Fire[j].BeCollided(m_BingHe.m_nCosmos);
		m_BingHe.BeCollided(nOldCosmos);
		}	

		for(i=0;i<MAX_FIRE_NUM;i++)
		if(m_FireBingHe[i].Collison(m_SSaint3Fire[j]))
		{
		m_SSaint3Fire[j].BeCollided(m_FireBingHe[i].m_nCosmos);
		m_FireBingHe[i].BeCollided();
		m_BingHe.m_nCosmos++;
		}
	}

	////4:
	if(m_BingHe.Collison(m_SSaint4))
	{
	nOldCosmos=m_SSaint4.m_nCosmos; 
	m_SSaint4.BeCollided(m_BingHe.m_nCosmos);
	m_BingHe.BeCollided(nOldCosmos);
	}

	for(i=0;i<MAX_FIRE_NUM;i++)
	if(m_FireBingHe[i].Collison(m_SSaint4))
	{
	m_SSaint4.BeCollided(m_FireBingHe[i].m_nCosmos);
    m_FireBingHe[i].BeCollided();
	m_BingHe.m_nCosmos++;
	m_nScorePlayer1++;
	}

	////4的子弹:
	for(j=0;j<m_SSaint4Fire3[0].m_nFireNum;j++)
	{
		if(m_BingHe.Collison(m_SSaint4Fire3[j]))
		{
		nOldCosmos=m_SSaint4Fire3[j].m_nCosmos; 
		m_SSaint4Fire3[j].BeCollided(m_BingHe.m_nCosmos);
		m_BingHe.BeCollided(nOldCosmos);
		}	

		for(i=0;i<MAX_FIRE_NUM;i++)
		if(m_FireBingHe[i].Collison(m_SSaint4Fire3[j]))
		{
		m_SSaint4Fire3[j].BeCollided(m_FireBingHe[i].m_nCosmos);
		m_FireBingHe[i].BeCollided();
		m_BingHe.m_nCosmos++;
		}
	}

	////沙加与冰河的子弹:
	if(m_BingHe.Collison(m_ShaJia))
	{
	nOldCosmos=m_ShaJia.m_nCosmos; 
	m_ShaJia.BeCollided(m_BingHe.m_nCosmos);
	m_BingHe.BeCollided(nOldCosmos);
	}

	for(i=0;i<MAX_FIRE_NUM;i++)
	if(m_FireBingHe[i].Collison(m_ShaJia))
	{
	m_ShaJia.BeCollided(m_FireBingHe[i].m_nCosmos);
    m_FireBingHe[i].BeCollided();
	m_BingHe.m_nCosmos++;
	m_nScorePlayer1++;
	}
	
	////沙加的5向子弹与冰河:
    for(j=0;j<m_ShaJiaFire7[0].m_nFireNum;j++)
    {
	    if(m_BingHe.Collison(m_ShaJiaFire7[j]))
		{
		nOldCosmos=m_ShaJiaFire7[j].m_nCosmos; 
		m_ShaJiaFire7[j].BeCollided(m_BingHe.m_nCosmos);
		m_BingHe.BeCollided(nOldCosmos);
		}
	}
	////沙加的莲花与冰河的子弹:
	for(j=0;j<LOTUS_NUM;j++)
	{
	    if(m_BingHe.Collison(m_Lotus[j]))
		{
		nOldCosmos=m_Lotus[j].m_nCosmos; 
		m_Lotus[j].BeCollided(m_BingHe.m_nCosmos);
		m_BingHe.BeCollided(nOldCosmos);
		}
		
		for(i=0;i<MAX_FIRE_NUM;i++)
		if(m_FireBingHe[i].Collison(m_Lotus[j]))
		{
		m_Lotus[j].BeCollided(m_FireBingHe[i].m_nCosmos);
		m_FireBingHe[i].BeCollided();
		m_BingHe.m_nCosmos++; 		
		m_nScorePlayer1++;
		}
	}
    
return true;
}

//////////////////////////////////////////////////////////////////////////////////////
void CStage1st::Show()
{
int i;//循环变量;

//画背景:
if(!m_BK.Show(m_pDD))return;
/*
//if(m_BK.m_bActive)
if(!m_pDD->BlitSourceToBack(m_BK.m_nX,
							m_BK.m_nY,
							m_BK.m_rcSource,
							DDBLTFAST_NOCOLORKEY))return;
*/
if(!m_PalaceGate.Show(m_pDD))return;
/*
if(m_PalaceGate.m_bActive)
if(!m_pDD->StretchBlitSourceToBack(m_PalaceGate.m_rcDestination,
								   m_PalaceGate.m_rcSource,
							       //DDBLT_NOCOLORKEY
								   NULL))return;
*/
//画分数:
if(m_ScorePlayer1.m_bActive)
if(!m_ScorePlayer1.Show(m_pDD))return;

//画石头:
	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_Stone[i].m_bActive)
	if(!m_pDD->BlitSourceToBack(m_Stone[i].m_nX,
							  m_Stone[i].m_nY,
							  m_Stone[i].m_rcSource,
							  DDBLTFAST_SRCCOLORKEY))return;
	
//画小敌人1,2,3,4:
	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_SSaint1[i].m_bActive)
	if(!m_pDD->BlitSourceToBack(m_SSaint1[i].m_nX,
							  m_SSaint1[i].m_nY,
							  m_SSaint1[i].m_rcSource,
							  DDBLTFAST_SRCCOLORKEY))return;
	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_SSaint2[i].m_bActive)
	if(!m_pDD->BlitSourceToBack(m_SSaint2[i].m_nX,
							  m_SSaint2[i].m_nY,
							  m_SSaint2[i].m_rcSource,
							  DDBLTFAST_SRCCOLORKEY))return;
	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_SSaint3[i].m_bActive)
	if(!m_pDD->BlitSourceToBack(m_SSaint3[i].m_nX,
							  m_SSaint3[i].m_nY,
							  m_SSaint3[i].m_rcSource,
							  DDBLTFAST_SRCCOLORKEY))return;
	//小敌人3的子弹:
	for(i=0;i<MAX_STONE_COLUMN;i++)
	if(m_SSaint3Fire[i].m_bActive)
	if(!m_pDD->BlitSourceToBack(m_SSaint3Fire[i].m_nX,
							    m_SSaint3Fire[i].m_nY,
							    m_SSaint3Fire[i].m_rcSource,
							    DDBLTFAST_SRCCOLORKEY))return;

	if(m_SSaint4.m_bActive)
	if(!m_pDD->BlitSourceToBack(m_SSaint4.m_nX,
							  m_SSaint4.m_nY,
							  m_SSaint4.m_rcSource,
							  DDBLTFAST_SRCCOLORKEY))return;

	for(i=0;i<m_SSaint4Fire3[i].m_nFireNum;i++)
	if(m_SSaint4Fire3[i].m_bActive)
	if(!m_pDD->BlitSourceToBack(m_SSaint4Fire3[i].m_nX,
							  m_SSaint4Fire3[i].m_nY,
							  m_SSaint4Fire3[i].m_rcSource,
							  DDBLTFAST_SRCCOLORKEY))return;

//画沙加及其子弹,莲花:
	if(m_CosmosShaJia.m_bActive)
    if(!m_pDD->BlitSourceToBack(m_CosmosShaJia.m_nX,
							  m_CosmosShaJia.m_nY,
							  m_CosmosShaJia.m_rcSource,
							  DDBLTFAST_SRCCOLORKEY))return;
	
	for(i=0;i<LOTUS_NUM;i++)
	if(m_Lotus[i].m_bActive)
	if(!m_pDD->BlitSourceToBack(m_Lotus[i].m_nX,
							  m_Lotus[i].m_nY,
							  m_Lotus[i].m_rcSource,
							  DDBLTFAST_SRCCOLORKEY))return;

	for(i=0;i<m_ShaJiaFire7[i].m_nFireNum;i++)
	if(m_ShaJiaFire7[i].m_bActive)
	if(!m_pDD->BlitSourceToBack(m_ShaJiaFire7[i].m_nX,
							    m_ShaJiaFire7[i].m_nY,
							    m_ShaJiaFire7[i].m_rcSource,
							    DDBLTFAST_SRCCOLORKEY))return;
	
	if(m_ShaJia.m_bActive)
	if(!m_pDD->BlitSourceToBack(m_ShaJia.m_nX,
							  m_ShaJia.m_nY,
							  m_ShaJia.m_rcSource,
							  DDBLTFAST_SRCCOLORKEY))return;
    
//画冰河及其子弹:
	if(m_CosmosBingHe.m_bActive)
    if(!m_pDD->BlitSourceToBack(m_CosmosBingHe.m_nX,
							  m_CosmosBingHe.m_nY,
							  m_CosmosBingHe.m_rcSource,
							  DDBLTFAST_SRCCOLORKEY))return;

	for(i=0;i<MAX_FIRE_NUM;i++)
	if(m_FireBingHe[i].m_bActive)
	if(!m_pDD->BlitSourceToBack(m_FireBingHe[i].m_nX,
							  m_FireBingHe[i].m_nY,
							  m_FireBingHe[i].m_rcSource,
							  DDBLTFAST_SRCCOLORKEY))return;
	if(m_BingHe.m_bActive)
	if(!m_pDD->BlitSourceToBack(m_BingHe.m_nX,
							  m_BingHe.m_nY,
							  m_BingHe.m_rcSource,
							  DDBLTFAST_SRCCOLORKEY))return;
	
	if(m_GameOverShow.m_bActive)
	if(!m_GameOverShow.Show(m_pDD))return;

//*/
//*/

//最后,切换图面:
m_pDD->FlipSurface();
return;
}

⌨️ 快捷键说明

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