{
SetDir(iDir); switch(GetDir()) {
case 0: SetSpeedX(0); SetSpeedY(-10); break; case 1: SetSpeedX(10); SetSpeedY(0); break; case 2: SetSpeedX(0); SetSpeedY(10); break; case 3: SetSpeedX(-10); SetSpeedY(0); break; }
SetSpriteRotation(90*GetDir());
SetSpriteLinearVelocity(GetSpeedX(),GetSpeedY()); }
6、在CGameMain类中添加表示子弹数目的成员变量m_iBulletNum(注意初始化为0)。
然后添加AddBullet方法。方法中有iDir、fPosX、fPosY、iOwner四个参数分别表示子弹方向、子弹初始位置的X轴Y轴坐标以及子弹所属坦克。由于地图上只有一个子弹模板,所以我们需要先复制这个模板,然后设置该精灵的世界边界。
void CGameMain::AddBullet( int iDir,float fPosX,float fPosY ,int iOwner) {
char* szName = CSystem::MakeSpriteName(\创建坦克名字 CBullet* pBullet = new CBullet(szName); pBullet->CloneSprite(\
pBullet->SetSpriteWorldLimit(WORLD_LIMIT_NULL,-26, -22, 26, 22); //设置世界边界 pBullet->SetSpritePosition(fPosX,fPosY);
pBullet->SetSpriteCollisionSend(true); //设置接收碰撞 pBullet->OnMove(iDir);
m_iBulletNum++; //子弹个数加1 if(iOwner == 1) {
pBullet->SetOwner(1);//1表示我方坦克发射的子弹 } else {
12
上海锐格软件有限公司
pBullet->SetOwner(0); //0表示地方坦克发射的子弹 } }
7、为CTankPlayer类增加OnFire方法,实现发射子弹的功能。在根据坦克的运动状态,
得到子弹的相关属性后,通过AddBullet方法在游戏中增加一发子弹。
void CTankPlayer::OnFire() {
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,1); }
因为用到g_GameMain这个全局对象,所以需要在CTankPlayer.cpp中声明头文件: #include”LessonX.h”
8、按J键发射子弹。在CGameMain类的OnKeyDown函数if(m_iGameState == 2)下添加
if(iKey == KEY_J)//判断按下键是够为J键 {
m_pTankPlayer->OnFire(); }
实验四 敌方坦克
【实验内容】
1、创建CTankEnemy类;
2、创建一个敌方坦克实例,实现坦克从上方左中右三个位置随机出现。 3、实现坦克隔2秒,随机改变一个方向。 4、实现坦克隔5秒发射一发子弹;
5、当坦克与世界边界碰撞时,改变方向;
【实验运行结果】
13
【实验思路】
同我方坦克一样,敌方坦克运动,也需要有运动方向、X轴Y轴速度三个基本属性。为了实现坦克能自由运动,即坦克运动一段时间后改变方向,需增加一个改变方向的时间间隔。同时为了实现坦克自动发射子弹,需增加一个发射子弹的时间间隔。
然后为敌方坦克增加移动和发射子弹的方法。
最后我们在CGameMain类的GameRun方法中调用敌方坦克移动和发射子弹的方法。 【实验指导】
1、通过类向导创建CTankEnemy类;
2、为类CTankEnemy添加m_iDir,m_fSpeedX,m_fSpeedY,m_iHp四个成员,分别表示方向、
X轴、Y轴速度和血量;
3、参照前面的实验,为CTankEnemy类添加构造函数和析构函数。
4、为类CTankEnemy添加Init方法初始化敌方坦克。设置血量为2,位置坐标为上方左
中右的随机位置,然后函数中给坦克精灵设置时间边界的大小,与世界边界的碰撞模式为WORLD_LIMIT_NULL,表示精灵与世界边界碰撞的响应由代码完成。最后设置方向和速度代码如下:
int iPos = CSystem::RandomRange(0,2); float fPosX; SetDir(2); SetHp(2); switch (iPos) {
case 0:
fPosX = -24.f; break; case 1:
fPosX = 0.f ;
14
上海锐格软件有限公司
break; case 2:
fPosX = 24.f; break; default:
break; }
SetSpritePosition(fPosX,-20.f); SetSpriteLinearVelocity(0.f,8.f);
SetSpriteCollisionActive(1,1); //设置可以接受和发送碰撞 SetSpriteRotation(float(90*GetDir()));
SetSpriteWorldLimit(WORLD_LIMIT_NULL,-26, -22, 26, 22);
5、为类CTankEnemy添加OnMove方法,实现坦克顺时针旋转90度运动。
然后根据方向设置子弹的运动速度m_fSpeedX,m_fSpeedY的值。与CTankPlayer类的OnMove方法类似。
设置速度方向与原来方向旋转90度的代码如下: int iDir=0;
if(GetDir()==0 || GetDir()==1 || GetDir()==2) {
iDir = GetDir()+1; }
Else //如果方向值等于3,设为0 {
iDir = 0; }
SetDir(iDir);
通过方向设置速度参考前边实验。
6、为类CTankEnemy添加带参的OnMove方法,参数fDeltaTime,为游戏的时间差,实
现隔一段时间随机改变方向。在CTankEnemy类中添加成员变量m_fChangeDirTime在构造函数中初始化为0,并添加get和set方法。 void CTankEnemy::OnMove(float fDeltaTime) {
m_fChangeDirTime+=fDeltaTime; if(m_fChangeDirTime>2.0f) {
OnMove();
m_fChangeDirTime = 0.f; } }
7、为类CTankEnemy添加OnFire方法,参数也为fDeltaTime,实现隔一段时间自动发
射子弹。在CTankEnemy类中添加成员m_fBulletCreateTime变量并在构造函数中初始化为0。
void CTankEnemy::OnFire(float fDeltaTime) {
15