m_fBulletCreateTime+=fDeltaTime; if(m_fBulletCreateTime>3.0f) {
m_fBulletCreateTime = 0.0f; float x,y;
x = GetSpritePositionX(); y = GetSpritePositionY(); switch(GetDir()) {
case 0:
y=y-GetSpriteHeight()/2-1; break; case 1:
x=x+GetSpriteWidth()/2+1; break; case 2:
y=y+GetSpriteHeight()/2+1; break; case 3:
x=x-GetSpriteWidth()/2-1; break;
}
g_GameMain.AddBullet(GetDir(),x,y,0); } }
因为用到全局对象G_GameMain,所以需要在TankEnemy.cpp中声明头文件: #include\
8、在CGameMain类中添加CTankEnemy类指针变量m_pTankEnemy。注意在LessonX.h
中声明头文件:
#include\然后在GameInit中创建并初始化。
m_pTankEnemy = new CTankEnemy(\m_pTankEnemy->Init();
9、在CGameMain类的GameRun方法中实现敌方坦克自由移动和发射子弹。
void CGameMain::GameRun( float fDeltaTime ) {
if(m_pTankEnemy) {
m_pTankEnemy->OnMove(fDeltaTime); m_pTankEnemy->OnFire(fDeltaTime); } }
10、在CGameMain类的OnSpriteColWorldLimit方法中添加敌方坦克与世界边界碰撞的
检测。
16
上海锐格软件有限公司
if(m_pTankEnemy&&strcmp(m_pTankEnemy->GetName(),szName)==0) {
m_pTankEnemy->OnMove(); }
实验五 加载地图
【实验内容】
1、加载游戏地图;
【实验运行结果】
【实验思路】
在CGameMain类中添加方法LoadMap实现地图加载。地图数据是已知的,数据中的0表示此处为空;1表示的是地图中此处为墙;2表示此处为玩家指挥部。每块墙大小为4*4。
【实验指导】
1、首先在LessonX.cpp中定义一个表示地图的二维数组来表示地图,其中0表示没有墙
块,1表示有墙块:
int g_iMap[11][13]= {
{0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,0,0,0,1,0,1,0,0,0,1,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1}, {0,0,0,1,0,1,0,1,0,1,0,0,0}, {0,0,0,1,0,0,0,0,0,1,0,0,0}, {0,0,0,1,0,1,0,1,0,1,0,0,0}, {1,1,1,1,1,1,1,1,1,1,1,1,1},
17
{0,1,0,1,0,0,0,0,0,1,0,1,0}, {0,0,0,0,0,1,1,1,0,0,0,0,0}, {0,0,0,0,0,1,0,1,0,0,0,0,0} };
2、在CGameMain类中添加LoadMap方法,实现加载地图。在方法中用for循环遍历地
图二维数组,当二维数组中的某个值为1时表示该处是一堵墙。
void CGameMain::LoadMap() {
char* szName; int i,j; 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、创建一个容器,用来存放所有精灵。
【实验运行结果】
18
上海锐格软件有限公司
【实验思路】
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()函数,此函数的作用是判断精灵是否死亡,在游戏运
19