09 C++课程设计_坦克大战 下载本文

float x,y; for(i=0;i<11;i++) {

for(j=0;j<13;j++) {

if(g_iMap[i][j]==1) {

szName = CSystem::MakeSpriteName(\重新起名 CSprite* pWall = new CSprite(szName); //新建对象 pWall->CloneSprite(\克隆墙块

pWall->SetSpriteCollisionActive(0,1); //设置为接受碰撞 pWall->SetSpriteCollisionResponse(COL_RESPONSE_CUSTOM); x =float(-24+4*j); y =float(-20+4*i);

pWall->SetSpritePosition(x,y); } } } }

3、 在GameInit中调用加载地图的函数:

LoadMap();

实验六 创建父类-CWeapon类

【实验内容】

1、添加CWeapon类,使CBullet、CTankPlayer、CTankEnemy类继承CWeapon类。 2、将三个子类OnFire和OnMove方法中相同的功能抽取出来,在父类中创建相应方法。

子类调用父类方法进行改进。

3、创建一个容器,用来存放所有精灵。

【实验运行结果】

20

上海锐格软件有限公司

【实验思路】

1、CBullet、CTankPlayer、CTankEnemy类中有许多共同的属性和方法,或者为了方便管理,

我们添加父类CWeapon。

2、把所有创建的精灵存入到容器中,增加从容器中查找和删除精灵的函数。在此基础上,

对整个项目进行大改。

注意此步骤对于下方实验非常重要,需要理解继承的用法,根据自己的理解把该删除和更改的地方做好。此实验会创建一个包含内容为CWeapon* 的容器,把创建的我方坦克,敌方坦克,墙块,子弹,全部存入到这个容器中进行管理。

【实验指导】

1、通过类向导添加CWeapon类,其继承于CSprite类。

2、根据分析为CWeapon类添加表示方向、血量、X轴Y轴速度、四个变量。

int m_iDir; int m_iHp; float m_fSpeedX; float m_fSpeedY;

添加get和set方法;

3、仿照前面的实验添加构造函数,在构造函数中对这些数值初始化,其中m_iHp初始

化为2,其他初始化为0; 4、添加函数以及虚函数:

bool IsDead(); //判断精灵是否死亡 virtual void Init(){}; //初始化函数

virtual void OnMove(float fDeltaTime){}; //敌方坦克移动函数 virtual void OnMove(){};

virtual void OnFire(float deltaTime){}; //发射子弹函数

virtual void OnSpriteColSprite(CWeapon* pSprite){}; //精灵与精灵碰撞时处理函数

在CWeapon类中实现IsDead()函数,此函数的作用是判断精灵是否死亡,在游戏运

21

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

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”Weapon.h” #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)

22

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

it++; } } }

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

灵添加到容器中。

1)将我方精灵添加容器中。之前我们在GameInit()函数中创建我方坦克和敌方坦克对象。在这个函数末尾增加下方代码: 下边添加如下代码:

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、当我方坦克被消灭或者我方军营被击中时,游戏结束。

【实验运行结果】

23