ImageVerifierCode 换一换
格式:DOCX , 页数:35 ,大小:375.38KB ,
资源ID:5911427      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-5911427.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(11C++课程设计太空战机Word格式.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

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

1、【实验思路】按空格键开始游戏,属于键盘按下事件,我们在dOnKeyDown函数中编写代码。在游戏中,我们运用面向对象的知识将战机看成一个对象,并为这个对象添加一个类叫CMyFighter。类具有属性和方法,要控制战机能在各个方向上自由的游动,我们为CMyFighter类添加上下左右四个方向的速度,并且我们为战机添加OnMove方法控制战机的游动状态。【实验指导】1、 在L CGameMain中定义类局部变量: CSprite * m_pBeginSprite ; /GameBegin就是我们“空格开始”精灵。CTextSprite * m_pCurScoreText;/显示当前积分CTextS

2、prite * m_pMaxScoreText;/ 显示最高分2、 在CGameMain类的构造函数中添加代码,对变量进行初始化。m_pBeginSprite = new CSprite(GameBegin);m_pCurScoreText = new CTextSprite(CurScoreText m_pMaxScoreText = new CTextSprite(MaxScoreText3、 在OnKeyDown中,当按下的按键为空格键并且此时的游戏状态为0,则设置游戏的状态为1。0表示此时游戏为等待状态,未开始。1表示游戏进行初始化,2表示初始化后会进入游戏运行状态。/ 按下空格,游戏

3、开始if( KEY_SPACE = iKey & 0 = GetGameState() )SetGameState( 1 );4、 在游戏初始化函数GameInit中隐藏 按空格开始游戏 这个提示图片。m_pBeginSprite-SetSpriteVisible( false );5、 通过类向导创建CMyFighter类,其继承于CSprite类。以VC+ 6.0为例:第一步、点击菜单“插入”-“新建类”。 第二步、在“New Class”对话框中输入类名和父类名。第三步、点击“更改”按钮,在新对话框中修改CMyFighter类的头文件和cpp文件的路径。将头文件保存到项目文件夹的Sour

4、ceCodeHeader文件夹中,将cpp文件保存到项目文件夹下的SourceCodeSrc文件夹中。这里需要特别注意的是创建文件路径的问题,所有的.h头文件应该在项目文件夹SourceCodeHeader中,所有的.cpp源文件应该放在项目文件夹下的SourceCodeSrc文件夹中。为CMyFighter类添加m_fVelocityLeft,m_fVelocityRight,m_fVelocityUp,m_fVelocityDown四个成员变量分别表示飞机上下左右的速度,权限为private。本文档的命名采用匈牙利命名法,m_表示类成员变量,i表示整型,f表示float型,sz表示字符指针

5、,g_表示全局变量等。1、 CMyFighter的父类是CSprite类(具体声明查看CommonClass.h),构造函数为CSprite( const char *szName )。所以通过上边方法自动生成的类,如果系统自动生成构造函数CMyFighter (void), 删除掉它以及在CMyFighter.cpp中自动生成的对构造函数实现的代码:CMyFighter: CMyFighter (void) 再为CMyFighter类添加新的构造函数:CMyFighter (const char* szName)。 CMyFighter (const char* szName):CSprit

6、e(szName) /对构造函数进行实现子类对象创建时,要先调用父类的构造函数完成父类部分的构造。如果父类没有默认构造函数,子类的构造函数必须显示调用父类的构造函数。CMyFighter构造函数调用CSprite类构造函数,并将参数szName的值传递给它,从而将名称为szName的精灵图片与CMyFighter对象绑定起来。6、 然后添加OnMove方法控制战机的游动,其参数bKeyDown表示键盘按键是否按下,iKey表示相应的是哪个按键。 void OnMove(bool bKeyDown, int iKey);7、 在CMyFighter类的构造函数中,首先初始4个方向的速度为0,然后

7、设置和世界编辑的碰撞属性为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轴上的速度,并设置战机的速度。void CMyFighter:OnMove(bool bKeyDown, int iKey) if(bKeyDown)

8、 switch(iKey) case KEY_A: / 左 m_fVelocityLeft = 30.f; break; case KEY_D: / 右 m_fVelocityRight = 30.f; case KEY_W: / 上 m_fVelocityUp = 15.f; case KEY_S: / 下 m_fVelocityDown = 15.f; else m_fVelocityLeft = 0.f; m_fVelocityRight = 0.f; m_fVelocityUp = 0.f; m_fVelocityDown = 0.f; float fVelX = m_fVelocit

9、yRight - m_fVelocityLeft; float fVelY = m_fVelocityDown - m_fVelocityUp; SetSpriteLinearVelocity( fVelX,fVelY );9、 在CGameMain类中,首先添加一个战机对象的指针m_pMyFighter。注意需要包含头文件:#includeMyFighter.h其次在构造函数中将m_pMyFighter赋予NULL的初始值。再次在GameInit方法中初始化m_pMyFighter。因为我们用new方法创建了m_pMyFighter对象,分配了内存,所以我们在CGameMain类的析构函数中

10、需要调用delete方法将 m_pMyFighter使用的内存释放掉。 / 创建玩家控制的Sprite if( NULL = m_pMyFighter ) m_pMyFighter = new CMyFighter(ControlSpritem_pMyFighter-SetSpriteWorldLimit(WORLD_LIMIT_STICKY,CSystem:GetScreenLeft()-10.f,CSystem:GetScreenTop(),CSystem:GetScreenRight(), CSystem:GetScreenBottom();10、 在OnKeyDown和OnkeyUp中

11、响应战机OnMove方法,它们的区别只是第一个参数的值不同。下面是OnKeyDown方法中的调用。if( 2 = GetGameState() ) /当游戏状态为2时 m_pMyFighter-OnMove(true,iKey);在OnKeyUp中调用if( 2 = GetGameState() )OnMove(false,iKey);11、 在CGameMain类的GameInit方法中显示当前积分和最高积分 / 更新当前等级/HP显示 m_CurScoreText-SetTextValue(0); m_MaxScoreText-实验二 添加子弹类,实现战机开炮1、 创建子弹类CBullet

12、;2、 通过空格键控制飞机发射子弹;3、 当空格键按下时,飞机每隔0.3秒发射一发子弹;运用面向对象的知识,我们将游戏中的元素都看为一个对象,因此我们将子弹对象抽象为CBullet类。当子弹与世界边界碰撞时,子弹消失。当空格键按下时飞机每隔0.3发射一发子弹,因此我们在飞机类中增加一个bool型的属性m_bFire,控制子弹是否发射。然后增加方法OnFire,参数为游戏循环一次的时间间隔,当时间间隔大于0.3时并且m_bFire为true时,飞机发射一发子弹。飞机发射的子弹,我们在CGameMain类中进行创建。在游戏循环的GameRun函数中调用飞机的OnFire方法,实现飞机每隔三秒发射一

13、发子弹。在CGameMain类中添加一个创举子弹的方法,当战机发射子弹时,调用此方法。1、 仿照创建我方战机的方法创建CBullet类;class CBullet : public CSpritepublic: CBullet( const char *szName); CBullet();2、 为CMyFighter增加控制是否发射子弹的变量,权限为Private。bool m_bCanFire;并添加SetCanFire方法设置其值,权限为Public。void SetCanFire( const bool bCan ) m_bCanFire = bCan;GetCanFire获取其值。

14、bool GetCanFire()return m_bCanFire;3、 再在CMyFighter添加m_fBulletCreateTime,表示子弹的发射间隔,注意在构造函数中初始化为0.3。然后添加LoopTick方法,处理子弹的发射。参数为游戏的时间间隔;/ 处理子弹的发射OnFire( float fDeltaTime ) m_fBulletCreateTime -= fDeltaTime; if( m_fBulletCreateTime CloneSprite( Bullet1_Template );SetSpritePosition( fPosX, fPosY );SetSpri

15、teLinearVelocityX( 60 );pBullet-SetSpriteWorldLimit(WORLD_LIMIT_NULL,CSystem:GetScreenRight() + 200.f, CSystem:这里用到CBullet类,所以应该在LessonX.h中包含头文件:Bullet.h5、 在CGameMain类GameRun方法中,调用CMyFighter类的OnFire方法,控制我们战机发射子弹;GameRun( float fDeltaTime ) / 执行我方战机的循环Tick函数 if( m_pMyFighter ) m_pMyFighter-OnFire( fD

16、eltaTime );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秒创建一架敌

17、方战机;4、 敌方战机每隔1秒发射一发子弹;5、 敌方战机飞行中上下浮动;运用面向对象知识,创建CEnemyFighter类。该类具有点方战机的属性,战机隔一定的事件被复制出来,然后上下浮动,开始向我方战机发射子弹,这样有助于增加敌方战机的杀伤力,也增加了游戏的趣味性。1、 仿照方便的方法创建CEnemyFighter类,其继承与CSprite类,修改其构造函数。2、 为类增添两个静态变量,一个表示表示创建敌机的数量,一个表示创建敌机的时间;static float m_fCreateTime; / 创建敌机的时间间隔static int m_iCreatedSpriteCount;/表示创建

18、战机数量并在LessonX.cpp文件最后进行初始化:float CEnemyFighter:m_fCreateTime = 0.f;int CEnemyFighter: m_iCreatedSpriteCount = 0;3、 为CEnemyFighter类添加一个创建敌方战机的静态方法ClassTick(float fDeltaTime)。1)在EnemyFighter类中添加函数的声明: void static ClassTick( float fDeltaTime );2)其参数为游戏的时间间隔。当创建战机的时间间隔递减为0时,创建战机。并重新设置时间间隔时间为5到10秒。void C

19、EnemyFighter:ClassTick( float fDeltaTime ) /创建敌方战机 / 是否到时间创建 m_fCreateTime -= fDeltaTime; if( m_fCreateTime = 0.f ) / 随机一个时间,作为下次出生的时间 m_fCreateTime = (float)CSystem:RandomRange( 1, 3 );/在以下添加创建一架敌方战机的代码2)创建战机时,只需要战机不显示在世界边界之外就可以,即Y轴坐标在比世界边界的上下边界稍微大一点的范围之间,在此我们设置比世界边界大10个世界坐标单位。在ClassTick方法的if( m_fC

20、reateTime HorizontalSprite_Template /克隆模板int iRandom = CSystem:RandomRange( iPosBase - 10, iPosBase + 10 );float fPosX = (int)CSystem:GetScreenRight() + 20.f;SetSpritePosition( fPosX, (float)iRandom );SetSpriteLinearVelocityX( -10.f ); SetSpriteWorldLimit(WORLD_LIMIT_KILL, CSystem:GetScreenBottom()

21、);SetSpriteCollisionActive(true,true); pSprite-SetHp(300);SetScore(100);SetType(1);这里用到sprintf函数,所以应该在EnemyFighter.cpp中包含头文件:#include4、 在添加CEnemyFighter类中添加LoopTick方法,实现在游戏循环时,战机发射子弹和上下浮动飞行的功能。其参数为,游戏的时间间隔。1)添加一个成员变量,表示战机创建之后,隔多久才可以开始发射子弹。确保飞机已经被看见,才会发射子弹。float m_fCanFireAfterCreated;2) 再添加三个成员变量,分别

22、表示子弹的发射间隔,战机飞行时上下浮动的时间间隔,战机飞行时是上浮还是下浮。float m_fBulletCreateTime;float m_fFloatTime;bool m_bFloatUp; 注意把这这些变量在构造函数中初始化。3) 然后在EnemyFighter.h中声明函数:void LoopTick( float fDeltaTime );在EnemyFighter.cpp中对函数进行实现:LoopTick( float fDeltaTime )4) 在函数中添加代码,当表示战机创建之后,隔多久才可以开始发射子弹的变量递减到小于等于0时,开始可以创建子弹,然后开始递减子弹的发射间

23、隔变量,当递减到小于等于0时,战机发射子弹。m_fCanFireAfterCreated -= fDeltaTime; if( m_fCanFireAfterCreated m_fBulletCreateTime -= fDeltaTime; if( m_fBulletCreateTime m_fBulletCreateTime = 1.f; g_GameMain.CreateBullet(GetSpritePositionX(),GetSpritePositionY(); 这里用到g_GameMain这个全局对象,所以应该在EnemyFighter.cpp中包含头文件:5) 添加战机上下浮动的代码。当战机浮动时,首先累计浮动的时间,当浮动时间大于1和小于0时,修改上浮还是下浮的变量值。然后获得战机此时的Y轴坐标,我们设置上下浮动的速度为6,这样就可以计算出浮动后的Y轴坐标。if( m_bFloatUp ) m_fFloatTime += fDeltaTime; i

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

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