行时,会根据这个函数的返回值来确定是否此精灵:
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
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) { 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