11C++课程设计太空战机.docx

上传人:b****2 文档编号:3386806 上传时间:2023-05-05 格式:DOCX 页数:35 大小:375.38KB
下载 相关 举报
11C++课程设计太空战机.docx_第1页
第1页 / 共35页
11C++课程设计太空战机.docx_第2页
第2页 / 共35页
11C++课程设计太空战机.docx_第3页
第3页 / 共35页
11C++课程设计太空战机.docx_第4页
第4页 / 共35页
11C++课程设计太空战机.docx_第5页
第5页 / 共35页
11C++课程设计太空战机.docx_第6页
第6页 / 共35页
11C++课程设计太空战机.docx_第7页
第7页 / 共35页
11C++课程设计太空战机.docx_第8页
第8页 / 共35页
11C++课程设计太空战机.docx_第9页
第9页 / 共35页
11C++课程设计太空战机.docx_第10页
第10页 / 共35页
11C++课程设计太空战机.docx_第11页
第11页 / 共35页
11C++课程设计太空战机.docx_第12页
第12页 / 共35页
11C++课程设计太空战机.docx_第13页
第13页 / 共35页
11C++课程设计太空战机.docx_第14页
第14页 / 共35页
11C++课程设计太空战机.docx_第15页
第15页 / 共35页
11C++课程设计太空战机.docx_第16页
第16页 / 共35页
11C++课程设计太空战机.docx_第17页
第17页 / 共35页
11C++课程设计太空战机.docx_第18页
第18页 / 共35页
11C++课程设计太空战机.docx_第19页
第19页 / 共35页
11C++课程设计太空战机.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

11C++课程设计太空战机.docx

《11C++课程设计太空战机.docx》由会员分享,可在线阅读,更多相关《11C++课程设计太空战机.docx(35页珍藏版)》请在冰点文库上搜索。

11C++课程设计太空战机.docx

11C++课程设计太空战机

11-C++课程设计-太空战机

FunCode程序设计实验教材系列

 

C++面向对象课程设计

实验指南

 

上海锐格软件有限公司

 

课程设计三太空战机

一、游戏介绍

太空战机是玩家用键盘控制战机移动并发射子弹,消灭敌方的战机。

敌方战机从右到左移动,同时上下浮动。

二、实验目的

综合应用C++语言和面向对象的知识开发一款小游戏。

三、实验内容

在外星球上,玩家通过键盘WSAD键控制己方战机,消灭外星球的邪恶战机。

要求如下:

1、游戏运行时,初始界面如下图。

2、按下空格键,游戏开始,玩家通过WSAD键控制己方战机移动;己方战机不能超出世界边界。

3、玩家战机每隔0.3秒发射一发子弹;

4、添加敌方战机,每隔5秒创建一架敌方战机;

5、敌方战机每隔3秒发射一发子弹;

6、记录游戏的最高分。

游戏初始界面

四、实验指南

实验一游戏开始和控制我方战机移动

【实验内容】

1、按空格键,游戏开始,“空格开始”字样消失。

2、创建CMyFighter类,并创建对象实例玩家控制的战机。

3、战机碰到世界边界时,静止。

4、游戏开始后,通过键盘WSAD键控制战机移动。

5、战机左右运动的速度为30。

上下运动的速度为15。

6、在游戏中显示游戏的当前积分和最高积分。

【实验思路】

按空格键开始游戏,属于键盘按下事件,我们在dOnKeyDown函数中编写代码。

在游戏中,我们运用面向对象的知识将战机看成一个对象,并为这个对象添加一个类叫CMyFighter。

类具有属性和方法,要控制战机能在各个方向上自由的游动,我们为CMyFighter类添加上下左右四个方向的速度,并且我们为战机添加OnMove方法控制战机的游动状态。

【实验指导】

1、在LCGameMain中定义类局部变量:

CSprite*m_pBeginSprite;//GameBegin就是我们“空格开始”精灵。

CTextSprite*m_pCurScoreText;//显示当前积分

CTextSprite*m_pMaxScoreText;//显示最高分

2、在CGameMain类的构造函数中添加代码,对变量进行初始化。

m_pBeginSprite=newCSprite("GameBegin");

m_pCurScoreText=newCTextSprite("CurScoreText");

m_pMaxScoreText=newCTextSprite("MaxScoreText");

3、在OnKeyDown中,当按下的按键为空格键并且此时的游戏状态为0,则设置游戏的状态为1。

0表示此时游戏为等待状态,未开始。

1表示游戏进行初始化,2表示初始化后会进入游戏运行状态。

//按下空格,游戏开始

if(KEY_SPACE==iKey&&0==GetGameState())

{

SetGameState

(1);

}

4、在游戏初始化函数GameInit中隐藏"按空格开始游戏"这个提示图片。

m_pBeginSprite->SetSpriteVisible(false);

5、通过类向导创建CMyFighter类,其继承于CSprite类。

以VC++6.0为例:

第一步、点击菜单“插入”-〉“新建类”。

第二步、在“NewClass”对话框中输入类名和父类名。

第三步、点击“更改”按钮,在新对话框中修改CMyFighter类的头文件和cpp文件的路径。

将头文件保存到项目文件夹的\SourceCode\Header文件夹中,将cpp文件保存到项目文件夹下的\SourceCode\Src文件夹中。

这里需要特别注意的是创建文件路径的问题,所有的.h头文件应该在项目文件夹\SourceCode\Header中,所有的.cpp源文件应该放在项目文件夹下的\SourceCode\Src文件夹中。

为CMyFighter类添加m_fVelocityLeft,m_fVelocityRight,m_fVelocityUp,m_fVelocityDown四个成员变量分别表示飞机上下左右的速度,权限为private。

本文档的命名采用匈牙利命名法,m_表示类成员变量,i表示整型,f表示float型,sz表示字符指针,g_表示全局变量等。

1、CMyFighter的父类是CSprite类(具体声明查看CommonClass.h),构造函数为CSprite(constchar*szName)。

所以通过上边方法自动生成的类,如果系统自动生成构造函数CMyFighter(void),删除掉它以及在CMyFighter.cpp中自动生成的对构造函数实现的代码:

CMyFighter:

:

CMyFighter(void)

{

}

再为CMyFighter类添加新的构造函数:

CMyFighter(constchar*szName)。

CMyFighter:

:

CMyFighter(constchar*szName):

CSprite(szName)//对构造函数进行实现

{

}

子类对象创建时,要先调用父类的构造函数完成父类部分的构造。

如果父类没有默认构造函数,子类的构造函数必须显示调用父类的构造函数。

CMyFighter构造函数调用CSprite类构造函数,并将参数szName的值传递给它,从而将名称为szName的精灵图片与CMyFighter对象绑定起来。

6、然后添加OnMove方法控制战机的游动,其参数bKeyDown表示键盘按键是否按下,iKey表示相应的是哪个按键。

voidOnMove(boolbKeyDown,intiKey);

7、在CMyFighter类的构造函数中,首先初始4个方向的速度为0,然后设置和世界编辑的碰撞属性为WORLD_LIMIT_STICKY,当碰到世界边界时,战机静止不动。

m_fVelocityLeft=0.f;

m_fVelocityRight=0.f;

m_fVelocityUp=0.f;

m_fVelocityDown=0.f;

8、编写CMyFighter类OnMove方法代码。

首先判断当前按键是按下还是松开的,其次判断是哪个按键的消息,根据这两个判断,为4个方向的速度矢量赋值。

再次算出X后和Y轴上的速度,并设置战机的速度。

voidCMyFighter:

:

OnMove(boolbKeyDown,intiKey)

{

if(bKeyDown)

{

switch(iKey)

{

caseKEY_A:

//左

m_fVelocityLeft=30.f;

break;

caseKEY_D:

//右

m_fVelocityRight=30.f;

break;

caseKEY_W:

//上

m_fVelocityUp=15.f;

break;

caseKEY_S:

//下

m_fVelocityDown=15.f;

break;

}

}

else

{

switch(iKey)

{

caseKEY_A:

//左

m_fVelocityLeft=0.f;

break;

caseKEY_D:

//右

m_fVelocityRight=0.f;

break;

caseKEY_W:

//上

m_fVelocityUp=0.f;

break;

caseKEY_S:

//下

m_fVelocityDown=0.f;

break;

}

}

floatfVelX=m_fVelocityRight-m_fVelocityLeft;

floatfVelY=m_fVelocityDown-m_fVelocityUp;

SetSpriteLinearVelocity(fVelX,fVelY);

}

9、在CGameMain类中,首先添加一个战机对象的指针m_pMyFighter。

注意需要包含头文件:

#include"MyFighter.h"

其次在构造函数中将m_pMyFighter赋予NULL的初始值。

再次在GameInit方法中初始化m_pMyFighter。

因为我们用new方法创建了m_pMyFighter对象,分配了内存,所以我们在CGameMain类的析构函数中需要调用delete方法将m_pMyFighter使用的内存释放掉。

//创建玩家控制的Sprite

if(NULL==m_pMyFighter)

{

m_pMyFighter=newCMyFighter("ControlSprite");

m_pMyFighter->SetSpriteWorldLimit(WORLD_LIMIT_STICKY,CSystem:

:

GetScreenLeft()-10.f,CSystem:

:

GetScreenTop(),CSystem:

:

GetScreenRight(),CSystem:

:

GetScreenBottom());

}

10、在OnKeyDown和OnkeyUp中响应战机OnMove方法,它们的区别只是第一个参数的值不同。

下面是OnKeyDown方法中的调用。

if(2==GetGameState())//当游戏状态为2时

{

m_pMyFighter->OnMove(true,iKey);

}

在OnKeyUp中调用

if(2==GetGameState())

{

m_pMyFighter->OnMove(false,iKey);

}

11、在CGameMain类的GameInit方法中显示当前积分和最高积分

//更新当前等级/HP显示

m_CurScoreText->SetTextValue(0);

m_MaxScoreText->SetTextValue(0);

实验二添加子弹类,实现战机开炮

【实验内容】

1、创建子弹类CBullet;

2、通过空格键控制飞机发射子弹;

3、当空格键按下时,飞机每隔0.3秒发射一发子弹;

【实验思路】

运用面向对象的知识,我们将游戏中的元素都看为一个对象,因此我们将子弹对象抽象为CBullet类。

当子弹与世界边界碰撞时,子弹消失。

当空格键按下时飞机每隔0.3发射一发子弹,因此我们在飞机类中增加一个bool型的属性m_bFire,控制子弹是否发射。

然后增加方法OnFire,参数为游戏循环一次的时间间隔,当时间间隔大于0.3时并且m_bFire为true时,飞机发射一发子弹。

飞机发射的子弹,我们在CGameMain类中进行创建。

在游戏循环的GameRun函数中调用飞机的OnFire方法,实现飞机每隔三秒发射一发子弹。

在CGameMain类中添加一个创举子弹的方法,当战机发射子弹时,调用此方法。

【实验指导】

1、仿照创建我方战机的方法创建CBullet类;

classCBullet:

publicCSprite

{

public:

CBullet(constchar*szName);

~CBullet();

};

2、为CMyFighter增加控制是否发射子弹的变量,权限为Private。

boolm_bCanFire;

并添加SetCanFire方法设置其值,权限为Public。

voidSetCanFire(constboolbCan){m_bCanFire=bCan;}

GetCanFire获取其值。

boolGetCanFire(){returnm_bCanFire;}

3、再在CMyFighter添加m_fBulletCreateTime,表示子弹的发射间隔,注意在构造函数中初始化为0.3。

然后添加LoopTick方法,处理子弹的发射。

参数为游戏的时间间隔;

//处理子弹的发射

voidCMyFighter:

:

OnFire(floatfDeltaTime)

{

m_fBulletCreateTime-=fDeltaTime;

if(m_fBulletCreateTime<=0.f&&m_bCanFire)

{

//固定发射时间

m_fBulletCreateTime=0.3f;

g_GameMain.CreateBullet(GetSpritePositionX(),GetSpritePositionY());

}

}

这里用到了g_GameMain这个全局对象,所以在CMyFight.cpp中应该包含头文件:

#include"LessonX.h"

4、在CGameMain类中添加m_iCreatedSpriteCount属性,表示游戏中发射子弹的数目注意在构造函数中初始化为0。

然后添加CreateBullet方法,参数为子弹的X轴和Y轴坐标。

并在该方法中创建一个子弹类,并设置子弹的位置和速度。

因为模板子弹的方向是朝左,所以需要设置子弹按X轴对称旋转;

voidCGameMain:

:

CreateBullet(constfloatfPosX,constfloatfPosY)

{

charszName[MAX_NAME_LEN];//MAX_NAME_LE为CommonClass.h中宏定义值为128

sprintf(szName,"Bullet1_%d",m_iCreatedSpriteCount);

m_iCreatedSpriteCount++;

CBullet*pBullet=newCBullet(szName);

pBullet->CloneSprite("Bullet1_Template");

pBullet->SetSpritePosition(fPosX,fPosY);

pBullet->SetSpriteLinearVelocityX(60);

pBullet->SetSpriteWorldLimit(WORLD_LIMIT_NULL,CSystem:

:

GetScreenLeft()-10.f,CSystem:

:

GetScreenTop(),CSystem:

:

GetScreenRight()+200.f,CSystem:

:

GetScreenBottom());

}

这里用到CBullet类,所以应该在LessonX.h中包含头文件:

#include"Bullet.h"

5、在CGameMain类GameRun方法中,调用CMyFighter类的OnFire方法,控制我们战机发射子弹;

voidCGameMain:

:

GameRun(floatfDeltaTime)

{

//执行我方战机的循环Tick函数

if(m_pMyFighter)

m_pMyFighter->OnFire(fDeltaTime);

}

6、但是我们子弹要发射子弹只有当空格键按下设置CMyFighter的m_bCanFire值为true。

在OnKeyDown方法中添加如下代码;

//游戏进行中,按下空格发射子弹

if(KEY_SPACE==iKey&&NULL!

=m_pMyFighter)

m_pMyFighter->SetCanFire(true);

7、同理在OnKeyUp中设置m_bCanFire值为false。

实验三敌方战机

【实验内容】

1、创建一个敌方战机类CEnemyFighter;

2、战机以编辑器中HorizontalSprite_Template精灵为模板;

3、每隔5秒创建一架敌方战机;

4、敌方战机每隔1秒发射一发子弹;

5、敌方战机飞行中上下浮动;

【实验思路】

运用面向对象知识,创建CEnemyFighter类。

该类具有点方战机的属性,战机隔一定的事件被复制出来,然后上下浮动,开始向我方战机发射子弹,这样有助于增加敌方战机的杀伤力,也增加了游戏的趣味性。

【实验指导】

1、仿照方便的方法创建CEnemyFighter类,其继承与CSprite类,修改其构造函数。

2、为类增添两个静态变量,一个表示表示创建敌机的数量,一个表示创建敌机的时间;

staticfloatm_fCreateTime;//创建敌机的时间间隔

staticintm_iCreatedSpriteCount;//表示创建战机数量

并在LessonX.cpp文件最后进行初始化:

floatCEnemyFighter:

:

m_fCreateTime=0.f;

intCEnemyFighter:

:

m_iCreatedSpriteCount=0;

3、为CEnemyFighter类添加一个创建敌方战机的静态方法ClassTick(floatfDeltaTime)。

1)在EnemyFighter类中添加函数的声明:

voidstaticClassTick(floatfDeltaTime);

2)其参数为游戏的时间间隔。

当创建战机的时间间隔递减为0时,创建战机。

并重新设置时间间隔时间为5到10秒。

voidCEnemyFighter:

:

ClassTick(floatfDeltaTime)//创建敌方战机

{

//是否到时间创建

m_fCreateTime-=fDeltaTime;

if(m_fCreateTime<=0.f)

{

//随机一个时间,作为下次出生的时间

m_fCreateTime=(float)CSystem:

:

RandomRange(1,3);

//在以下添加创建一架敌方战机的代码

}

}

2)创建战机时,只需要战机不显示在世界边界之外就可以,即Y轴坐标在比世界边界的上下边界稍微大一点的范围之间,在此我们设置比世界边界大10个世界坐标单位。

在ClassTick方法的if(m_fCreateTime<=0.f)判断中添加以下代码:

IntiPosBase=CSystem:

:

RandomRange((int)CSystem:

:

GetScreenTop()+10,(int)CSystem:

:

GetScreenBottom()-10);

2)然后声明一个CEnemyFighter类对象。

然后设置敌方飞机X轴和Y轴的坐标,再次设置速度,设置世界边界碰撞属性,走后设置其碰撞模式以及初始化其成员变量的值。

charszName[MAX_NAME_LEN];

sprintf(szName,"HorizontalSprite_%d",m_iCreatedSpriteCount);//给新建的敌方战机起名

m_iCreatedSpriteCount++;

CEnemyFighter*pSprite=newCEnemyFighter(szName);

pSprite->CloneSprite("HorizontalSprite_Template");//克隆模板

intiRandom=CSystem:

:

RandomRange(iPosBase-10,iPosBase+10);

floatfPosX=(int)CSystem:

:

GetScreenRight()+20.f;

pSprite->SetSpritePosition(fPosX,(float)iRandom);

pSprite->SetSpriteLinearVelocityX(-10.f);

pSprite->SetSpriteWorldLimit(WORLD_LIMIT_KILL,CSystem:

:

GetScreenLeft()-10.f,CSystem:

:

GetScreenTop(),CSystem:

:

GetScreenRight()+200.f,CSystem:

:

GetScreenBottom());

pSprite->SetSpriteCollisionActive(true,true);

pSprite->SetHp(300);

pSprite->SetScore(100);

pSprite->SetType

(1);

这里用到sprintf函数,所以应该在EnemyFighter.cpp中包含头文件:

#include

4、在添加CEnemyFighter类中添加LoopTick方法,实现在游戏循环时,战机发射子弹和上下浮动飞行的功能。

其参数为,游戏的时间间隔。

1)添加一个成员变量,表示战机创建之后,隔多久才可以开始发射子弹。

确保飞机已经被看见,才会发射子弹。

floatm_fCanFireAfterCreated;

2)再添加三个成员变量,分别表示子弹的发射间隔,战机飞行时上下浮动的时间间隔,战机飞行时是上浮还是下浮。

floatm_fBulletCreateTime;

floatm_fFloatTime;

boolm_bFloatUp;

注意把这这些变量在构造函数中初始化。

3)然后在EnemyFighter.h中声明函数:

voidLoopTick(floatfDeltaTime);

在EnemyFighter.cpp中对函数进行实现:

voidCEnemyFighter:

:

LoopTick(floatfDeltaTime)

{

}

4)在函数中添加代码,当表示战机创建之后,隔多久才可以开始发射子弹的变量递减到小于等于0时,开始可以创建子弹,然后开始递减子弹的发射间隔变量,当递减到小于等于0时,战机发射子弹。

m_fCanFireAfterCreated-=fDeltaTime;

if(m_fCanFireAfterCreated<=0.f)

{

m_fBulletCreateTime-=fDeltaTime;

if(m_fBulletCreateTime<=0.f)

{

m_fBulletCreateTime=1.f;

g_GameMain.CreateBullet(GetSpritePositionX(),

GetSpritePositionY());

}

}

这里用到g_GameMain这个全局对象,所以应该在EnemyFighter.cpp中包含头文件:

#include"LessonX.h"

5)添加战机上下浮动的代码。

当战机浮动时,首先累计浮动的时间,当浮动时间大于1和小于0时,修改上浮还是下浮的变量值。

然后获得战机此时的Y轴坐标,我们设置上下浮动的速度为6,这样就可以计算出浮动后的Y轴坐标。

if(m_bFloatUp)

{

m_fFloatTime+=fDeltaTime;

i

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2