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
注意用到容器,添加头文件声明和命名空间:
#include”Weapon.h” #include
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 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