/////////////////////////////////////////////////////////////////////////////////
//
//
//
//
/////////////////////////////////////////////////////////////////////////////////
#include <Stdio.h>
#include "CommonClass.h"
#include "LessonX.h"
#include "Bullet.h"
////////////////////////////////////////////////////////////////////////////////
//
//
CGameMain g_GameMain;
//地图
int g_iMap[11][13]=
{ {0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,0,1,0,1,0,1,0,1,0,1,0},
{0,1,0,1,0,1,1,1,0,1,0,1,0},
{0,1,0,1,0,1,0,1,0,1,0,1,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,1,1,1,0,0,0,0,0},
{0,1,0,1,0,0,0,0,0,1,0,1,0},
{0,1,0,1,0,0,0,0,0,1,0,1,0},
{0,1,0,1,0,1,1,1,0,1,0,1,0},
{0,0,0,0,0,1,0,1,0,0,0,0,0}
};
//==============================================================================
//
// 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。
//==============================================================================
//
// 构造函数
CGameMain::CGameMain()
{
//设置游戏状态
m_iGameState = 0;
//实例化精灵
m_pSplash = new CSprite("splash");
m_pStart = new CSprite("start");
m_iBulletNum=0;//子弹数量
m_fTankEnemyTime=0;//仅为了初始化
m_iTankEnemyNumber=3;//设置最大坦克数量
//游戏信息初始化
m_pScore = new CTextSprite("score");
m_pHight = new CTextSprite("hight");
m_pEnemy = new CTextSprite("enemyNum");
m_iScore=0;//分数
m_iEnemy=0;//敌人数量
m_iHight = 0;
m_fDeltaTime = 0.f;
}
//==============================================================================
//
// 析构函数
CGameMain::~CGameMain()
{
delete m_pSplash;
delete m_pStart;
}
//==============================================================================
//
// 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次
// 用以处理游戏的开始、进行中、结束等各种状态.
// 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒
void CGameMain::GameMainLoop( float fDeltaTime )
{
switch( GetGameState() )
{
// 初始化游戏,清空上一局相关数据
case 1:
{
GameInit();
SetGameState(2); // 初始化之后,将游戏状态设置为进行中
}
break;
// 游戏进行中,处理各种游戏逻辑
case 2:
{
//设置在我方坦克死亡,我方军营死亡,或者游戏时间>30秒的条件下,游戏结束。
if(!m_pTankPlayer->IsDead() && !m_pAim_nor->IsDead() && m_fDeltaTime<90)
{
GameRun( fDeltaTime );
}
else // 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态
{
SetGameState(0);
GameEnd();
}
}
break;
// 游戏结束/等待按空格键开始
case 0:
default:
break;
};
}
//=============================================================================
//
// 每局开始前进行初始化,清空上一局相关数据
void CGameMain::GameInit()
{
//设置开始图片不可见
m_pSplash->SetSpriteVisible(false);
m_pStart->SetSpriteVisible(false);
//新建一个名字是myPlayer的我方坦克对象
m_pTankPlayer=new CTankPlayer("myplayer");
//我方坦克克隆在funcode模板中存在的名字为player的坦克,表示新建的坦克对象有现在精灵的所有属性
m_pTankPlayer->CloneSprite("player");
m_pTankPlayer->Init();
m_vWeapon.push_back(m_pTankPlayer);//保存到容器
//敌方坦克初始化
//m_pTankEnemy = new CTankEnemy("enemy");
//m_pTankEnemy->Init();
//我方军营初始化
m_pAim_nor = new CWeapon("myaim_nor");
m_pAim_nor->CloneSprite("aim_nor");
m_vWeapon.push_back(m_pAim_nor);//精灵装入容器
m_pAim_nor->SetSpriteCollisionReceive(true);
m_pAim_nor->SetSpritePosition(0.f,20.f);
//地图初始化
LoadMap();
//其他数据初始化
m_iBulletNum = 0;
m_iTankEnemyNumber = 0;
m_fTankEnemyTime = 4.f;
m_iScore = 0;
m_iHight = 0;
m_iEnemy = 0;
m_fDeltaTime = 0.f;
//读取或生成保存数据文件
FILE * fp =fopen("save.dat","r+");
if(fp)
{
fread(&m_iHight,sizeof(int),1,fp);
fclose(fp);
}
m_pHight = new CTextSprite("hight");
m_pHight->SetTextValue(m_iHight);
}
//=============================================================================
//
// 每局游戏进行中
void CGameMain::GameRun( float fDeltaTime )
{
AddTankEnemy(fDeltaTime);
/*
if(m_pTankEnemy)
{
m_pTankEnemy->OnMove(fDeltaTime);
m_pTankEnemy->OnFire(fDeltaTime);
}*/
for(int i=0;i<m_vWeapon.size();i++)
{
if(!m_vWeapon[i]->IsDead())
{
m_vWeapon[i]->OnMove(fDeltaTime);
m_vWeapon[i]->OnFire(fDeltaTime);
}
else
{
DeleteWeaponByName(m_vWeapon[i]->GetName());
}
}
m_fDeltaTime += fDeltaTime;//游戏时间成员累加时间
//实时显示游戏数据
m_pScore->SetTextValue(m_iScore);
m_pHight->SetTextValue(m_iHight);
m_pEnemy->SetTextValue(m_iEnemy);
}
//=============================================================================
//
// 本局游戏结束
void CGameMain::GameEnd()
{
//当游戏的得分大于最高分时,将游戏的得分写入文件中
FILE * fp =fopen("save.dat","w+");
if(m_iScore>m_iHight)
fwrite(&m_iScore,sizeof(int),1,fp);
fclose(fp);
//删除精灵
DeleteAllSprite();
//最后游戏结束后,设置游戏开始界面可见并游戏状态为0。
m_pSplash->SetSpriteVisible(true);
m_pStart->SetSpriteVisible(true);
SetGameState(0);
}
//键盘按下
void CGameMain::OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )
{
if( m_iGameState==0 )
{
//当按下空格设置游戏状态为1
if(iKey == KEY_SPACE)
{
m_iGameState = 1;
}
}
//游戏进行时按键盘
if(m_iGameState == 2)
{
if(iKey == KEY_J)//判断按下键是够为J键
{
m_pTankPlayer->OnFire();
}
m_pTankPlayer->OnMove(iKey, true);
}
}
//按键松开
void CGameMain::OnKeyUp( const int iKey )
{
if(m_iGameState == 2)
{
m_pTankPlayer->OnMove(iKey, false);
}
}
//坦克碰到边界方法
void CGameMain::OnSpriteColWorldLimit( const char *szName, const int iColSide )
{
if(strstr(szName,"player") != NULL) //判断碰到世界边界的坦克为我方坦克时
{
m_pTankPlayer->SetSpriteLinearVelocity(0,0);
}else if(strstr(szName,"enemy") != NULL)//判断碰到世界边界的坦克为敌方坦克时
{
CWeapon* pEnemy = FindWeaponByName(szName);
pEnemy->SetSpriteLinearVelocity(0.f,0.f);
pEnemy->OnMove();
}
else if(strstr(szName,"bullet") != NULL)//判断碰到世界边界的坦克为子弹时
{
CWeapon* pBullet = FindWeaponByName(szName);
pBullet->SetHp(0);
}
}
//子弹生成
void CGameMain::AddBullet( int iDir,float fPosX,float fPosY ,int iOwner)
{
char* szName = CSystem::MakeSpriteName("bullet",m_iBulletNum);//创建坦克名字
CBullet* pBullet = new CBullet(szName);
pBullet->CloneSprite("bullet");
pBullet->SetSpriteWorldLimit(WORLD_LIMIT_NULL,-26, -22, 26, 22); //设置世界边界
pBullet->SetSpritePosition(fPosX,fPosY);
pBullet->SetSpriteCollisionSend(true); //设置接收碰撞
pBullet->OnMove(iDir);
m_iBulletNum++; //子弹个数加1
if(iOwner == 1)
{
pBullet->SetOwner(1);//1表示我方坦克发射的子弹
}
else
{
pBullet->SetOwner(0); //0表示地方坦克发射的子弹
}
m_vWeapon.push_back(pBullet);//保存到容器
}
//地图载入
void CGameMain::LoadMap()
{
char* szName;
int i,j;
float x,y;
for(i=0;i<11;i++)
{
for(j=0;j<13;j++)
{
if(g_iMap[i][j]==1)
{
szName = CSystem::MakeSpriteName("wall",j+i*13+i);//重新起名
CWeapon* pWall = new CWeapon(szName); //新建对象
pWall->CloneSprite("wall"); //克隆墙块
pWall->SetSpriteCollisionActive(0,1); //设置为接受碰撞
pWall->SetSpriteCollisionResponse(COL_RESPONSE_CUSTOM);
x =float(-24+4*j);
y =float(-20+4*i);
pWall->SetSpritePosition(x,y);
m_vWeapon.push_back(pWall);//保存到容器
}
}
}
}
//查找精灵
CWeapon* CGameMain::FindWeaponByName(const char* szName)//根据名字查找到对象
{
for(int i=0; i<m_vWeapon.size(); i++)
{
if(strcmp(szName,m_vWeapon[i]->GetName()) == 0)
{
return m_vWeapon[i];
}
}
}
//删除精灵
void CGameMain::DeleteWeaponByName(const char* szNa