funcode C++课程设计_坦克大战 联系客服

发布时间 : 星期六 文章funcode C++课程设计_坦克大战更新完毕开始阅读

m_pAim_nor->CloneSprite(\m_vWeapon.push_back(m_pAim_nor); m_pAim_nor->SetSpriteCollisionReceive(true); m_pAim_nor->SetSpritePosition(0.f,20.f);

6、在CTankPlayer类中添加我方坦克与其他精灵碰撞的处理函数,使我方坦克碰到子弹后,

血量设为0,碰到墙后,设置速度为0:

void CTankPlayer::OnSpriteColSprite(CWeapon* pSprite) {

if(pSprite == NULL) {

return; }

else if(strstr(pSprite->GetName(),\{

SetHp(0); }

else if(strstr(pSprite->GetName(),\{

SetSpeedX(0); SetSpeedY(0);

SetSpriteLinearVelocity(GetSpeedX(),GetSpeedY()); } }

7、在CBullet类中添加子弹与其他精灵碰撞后的判断代码,判断子弹与其他精灵碰撞发生的

反应,当我方子弹与军营发生碰撞,地方坦克发射的子弹与敌方坦克发送碰撞时,只设置子弹血量为0,其他不做处理。其他情况,设置被碰撞精灵血量为0:

void CBullet::OnSpriteColSprite(CWeapon* pSprite) {

if(pSprite == NULL) {

return; } SetHp(0);

if(GetOwner() == 1 && strstr(pSprite->GetName(),\ //我方坦克子弹与军营发生碰撞 {

return; }

if(GetOwner() == 0 && strstr(pSprite->GetName(),\敌方坦克子弹打中地方坦克 {

return; }

pSprite->SetHp(0);

24

上海锐格软件有限公司 } 8、在CTankEnemy类中添加地方坦克与其他精灵碰撞的处理函数,设置速度为0,并设置转

换方向的时间m_fChangeDirTime为1.8,在CGameMain类GameRun函数中,当

m_fChangeDirTime>2时,敌方坦克转向。所以在0.2秒之后,这个坦克会自动转向。

void CTankEnemy::OnSpriteColSprite(CWeapon* pSprite)

{

if(pSprite == NULL) {

return; }

SetSpriteLinearVelocity(0.f,0.f); m_fChangeDirTime = 1.8; }

9、在CGameMain中添加事件函数OnSpriteColSprite,表示精灵与精灵碰撞事件。

然后OnSpriteColSprite中添加碰撞检测。进行的检测顺序是,首先判断发送碰撞方为谁,然后调用发送碰撞对象的碰撞处理函数,代码如下:

voidCGameMain::OnSpriteColSprite(const char *szSrcName, const char *szTarName) {

CWeapon* tarSprite = FindWeaponByName(szTarName); if(strstr(szSrcName,\发送碰撞为子弹 {

CBullet *tmpBullet = (CBullet*)FindWeaponByName(szSrcName); tmpBullet->OnSpriteColSprite(tarSprite); }

else if(strcmp(szSrcName,\发送碰撞为我方坦克 {

m_pTankPlayer->OnSpriteColSprite(tarSprite); }

else if(strstr(szSrcName,\发送碰撞为敌方坦克 {

CTankEnemy* tmpEnemy = (CTankEnemy*)FindWeaponByName(szSrcName); tmpEnemy->OnSpriteColSprite(tarSprite); } }

实验八 显示游戏信息

【实验内容】

1、显示游戏的得分等信息。

2、完善游戏,使游戏能够循环运行。

3、记录游戏的分数,当分数高于上次的得分时,将此次得分写入文件。

【实验运行结果】

25

【实验思路】

在OnSpriteColSprite碰撞检测中,每消灭一辆地方坦克加1分,同时敌方坦克数量减1。

完善CGameMain中的GameInit,GameEnd等,使程序能够循环运行。

在CGameMain类的GameInit方法中,读取游戏的最高分。在游戏结束GameEnd方法中,记录游戏的最高分。

【实验指导】

1、在CGameMain中添加以下成员变量:

CTextSprite* m_pScore; //表示分数的文本精灵 CTextSprite* m_pHight; //表示最高分的文本精灵 CTextSprite* m_pEnemy;//表示敌人数量的文本精灵 int m_iScore;//分数 int m_iEnemy;//敌人数量 int m_iHight;//几局最高分

float m_fDeltaTime;//表示游戏时间

在构造函数中创建这三个文本精灵对象并初始化变量: m_pScore = new CTextSprite(\m_pHight = new CTextSprite(\m_pEnemy = new CTextSprite(\ m_iScore=0;//分数 im_iEnemy=0;//敌人数量 m_iHight = 0; m_fDeltaTime = 0.f;

2、在AddTankEnemy()中的if(m_fTankEnemyTime > 5)判断里添加代码使坦克数量增长。

m_iEnemy++;

26

上海锐格软件有限公司

3、在OnSpriteColSprite函数中,在判断发送碰撞为子弹的if(strstr(szSrcName,\

下添加代码:

if( tmpBullet->GetOwner()==1 && strstr(szTarName,\{

m_iScore++; m_iEnemy--; }

4、在GameInit方法初始化变量,并打开记录文件,如果文件不存在则创建该文件,如果存

在,则读取数据。并显示在游戏中。

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(\if(fp) {

fread(&m_iHight,sizeof(int),1,fp); fclose(fp); }

m_pHight = new CTextSprite(\m_pHight->SetTextValue(m_iHight);

5、表示游戏时间的成员变量m_fDeltaTime在GameRun自增:

m_fDeltaTime += fDeltaTime;

6、实时显示游戏数据,在GameRun函数中添加代码:

m_pScore->SetTextValue(m_iScore); m_pHight->SetTextValue(m_iHight); m_pEnemy->SetTextValue(m_iEnemy);

7、设置在我方坦克死亡,我方军营死亡,或者游戏时间>30秒的条件下,游戏结束。更改CGameMain类GameMainLoop函数中case2的判断条件: 将if(true)改为

if(!m_pTankPlayer->IsDead() && !m_pAim_nor->IsDead() && m_fDeltaTime<30)

8、创建删除所有精灵的函数DeleteAllSprite():

voidCGameMain::DeleteAllSprite() {

int n=m_vWeapon.size(); while(m_vWeapon.size()!=0) {

vector::iterator itr=m_vWeapon.begin(); CWeapon* cw = *itr;

27