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

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

行时,会根据这个函数的返回值来确定是否此精灵:

boolCWeapon::IsDead() {

if(m_iHp == 0) {

return true; }

return false; }

5、将CBullet、CTankPlayer、CTankEnemy类的父类改为CWeapon。

例如在TankPlayer.h中把class CTankPlayer :public CSprite 改为class CTankPlayer :public CWeapon

注意需要Bullet.h、TankPlayer.h、TankEnemy.h包含头文件:

#include\

6、注意同时修改构造函数。把继承类的名称由CSprite改为Cweapon。删除与CWeapon

定义重复的变量声明,原来的get和set方法,以及在构造函数中对这些变量赋初值的代码。特别主要要设置Hp=2。

7、在CGameMain类中添加一个成员变量m_vWeapon,用来存储所有精灵:

vector m_vWeapon;

注意用到容器,添加头文件声明和命名空间:

#include using namespace std;

8、然后声明和定义查找和删除容器成员的两个函数FindWeaponByName和

DeleteWeaponByName:

CWeapon* CGameMain::FindWeaponByName(const char* szName)//根据名字查找到对象 {

for(int i=0; i

if(strcmp(szName,m_vWeapon[i]->GetName()) == 0) {

return m_vWeapon[i]; } } }

void CGameMain::DeleteWeaponByName(const char* szName)//根据名字把精灵从容器中删除 {

for(vector::iterator it=m_vWeapon.begin();it!=m_vWeapon.end();) {

CWeapon* cw =*it;

if(strcmp(szName,cw->GetName()) == 0) {

20

上海锐格软件有限公司 m_vWeapon.erase(it); cw->DeleteSprite(); delete cw; break; } else {

it++; } } }

9、在前边创建子弹、我方坦克、以及地图的地方用m_vWeapon.push_back()函数把精

灵添加到容器中。

1)我方精灵添加容器中方法为,在GameInit()函数中创建我方坦克的代码: m_pTankPlayer=new CTankPlayer(\m_pTankPlayer->CloneSprite(\m_pTankPlayer->Init(); 下边添加如下代码:

m_vWeapon.push_back(m_pTankPlayer);

2)子弹添加到容器,在AddBullet函数最后添加一行代码: m_vWeapon.push_back(pBullet);

3)地图添加容器,在LoadMap()函数中,把CSprite* pWall = new CSprite(szName);改为:

CWeapon* pWall = new CWeapon(szName); 然后在pWall->SetSpritePosition(x,y);下添加: m_vWeapon.push_back(pWall);

实验七 游戏整体正常运行

【实验内容】

1、创建敌方坦克每隔5秒出现一辆,从屏幕上方的左、中、右三个位置随机出现。 2、当子弹与游戏中的任何东西碰撞时,双方都消失;

3、当我方坦克与敌方坦克碰撞时,我方坦克静止不动,敌方坦克改变方向; 4、当我方坦克被消灭或者我方军营被击中时,游戏结束。

【实验运行结果】

21

【实验思路】

3、创建一个函数生成坦克的函数产生坦克。 4、在OnSpriteColSprite方法中添加碰撞检测。

5、更改在OnSpriteColWorldLimit中与世界边界的碰撞检测。

【实验指导】

1、注释掉实验四中,在CGameMain类中添加的声明和创建一个敌方坦克对象的代码。

LessonX.h中:

//CTankEnemy* m_pTankEnemy; 在Lesson.cpp文件GameInit函数:

//m_pTankEnemy = new CTankEnemy(\//m_pTankEnemy->Init();

同时注释在GameRun函数中添加的使敌方坦克运动的代码。 /*if(m_pTankEnemy) {

m_pTankEnemy->OnMove(fDeltaTime); m_pTankEnemy->OnFire(fDeltaTime); }*/ 2、在CGameMain中创建一个不断产生地方坦克的函数AddTankEnemy。

先在CGameMain中添加一个成员变量m_fTankEnemyTime和m_iTankEnemyNumber 分别代表创建坦克时间,以及坦克数量(注意将两数进行初始化)。当时间m_fTankEnemyTime

大于5时,创建敌方坦克,设置属性,并进行调用初始化函数init来设置敌方坦克的初始位置以及碰撞模式等内容。

voidCGameMain::AddTankEnemy(float fDeltaTime) {

m_fTankEnemyTime += fDeltaTime; if(m_fTankEnemyTime > 5)

22

上海锐格软件有限公司 { char* szName = CSystem::MakeSpriteName(\CTankEnemy* m_pTankEnemy = new CTankEnemy(szName); m_pTankEnemy->CloneSprite(\m_pTankEnemy->Init(); m_iTankEnemyNumber++;

m_vWeapon.push_back(m_pTankEnemy); //把创建的敌方坦克插入到容器中 m_fTankEnemyTime=0.f; } }

在CGameMain类的GameRun函数中调用增加敌方坦克的函数:

AddTankEnemy(fDeltaTime);

此时运行游戏可以看到,每五秒有一辆敌方坦克从下方随机生成并向下运动。 3、在GameRun中添加代码遍历容器,调用精灵移动以及发射函数(子弹和墙没有对这两个

函数进行实现,因此不会产生效果),把已死亡的精灵进行删除,使游戏运行正常。

for(int i=0;i

if(!m_vWeapon[i]->IsDead()) {

m_vWeapon[i]->OnMove(fDeltaTime); m_vWeapon[i]->OnFire(fDeltaTime); } else {

DeleteWeaponByName(m_vWeapon[i]->GetName()); } }

4、更改精灵世界边界碰撞时间函数中的代码,更改判断敌方坦克与世界边界碰撞和子弹与世界边界碰撞的代码:

else if(strstr(szName,\{

CWeapon* pEnemy = FindWeaponByName(szName); pEnemy->SetSpriteLinearVelocity(0.f,0.f); pEnemy->OnMove(); }

else if(strstr(szName,\{

CWeapon* pBullet = FindWeaponByName(szName); pBullet->SetHp(0); }

5、在CGameMain中添加对CWeapon *类型对象m_pAim_nor表示我方军营。

在GameInit中创建我方军营精灵,把军营精灵插入到容器中,设置接收碰撞以及坐标。

m_pAim_nor = new CWeapon(\

23