funcode C++课程设计_坦克大战 联系客服

发布时间 : 星期六 文章funcode C++课程设计_坦克大战更新完毕开始阅读

{

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