太空战机c语言源码,太空战机实验报告

《太空战机实验报告》由会员分享,可在线阅读,更多相关《太空战机实验报告(56页珍藏版)》请在人人文库网上搜索。

1、太空战机实验报告1. 实验截图图一开始游戏图二我方战机,敌方战机出现。敌方战机随机发射子弹,并上下浮动。背景音乐响起。图三射杀战机,积分增加。敌机与子弹碰撞,消失。图四被敌机射杀,血量减少为02. 游戏功能游戏规则1. 按下空格键游戏开始。2. 通过WSAD 键控制玩家飞机移动上下左右移动,但不能飞出边境。3. 当玩家按下空格键时,玩家飞机发射子弹。4. 玩家飞机被敌机碰到后,生命值会减少,生命值变为0的时候,游戏结束。5. 在游戏右方会一直出现电脑飞机(敌机),敌机分为超大、大、中、小四种类型,越大的飞机出现的几率越小。6. 敌机被玩家飞机击中后,生命值会减少,生命值变为0时,该敌机被摧毁,。

2、玩家得分。越大的飞机越难击毁,击毁后玩家得分也越多。7. 敌机飞到界面左方时,删除敌机。8. 敌方飞机的子弹分为两种,一种为普通子弹,另一种子弹为高级子弹,当敌方飞机的普通子弹与玩家飞机的子弹碰撞时相互抵消,敌方飞机的高级子弹不会与玩家飞机的子弹抵消9. 在界面外用一个文本显示玩家游戏得分。3. 流程图4. 数据结构创建5个继承类:我方战机类CMyFighter、子弹类CBullet、敌方战机类CEnemyFighter类、链表类CSpriteList、精灵父类CGameSprite。1. 我方战机类CMyFighter:m_fVelocityLeft;/ 控制飞机飞行的速度上下左右。m_fV。

3、elocityRight;m_fVelocityUp;m_fVelocityDown;m_fBulletCreateTime; /表示子弹的发射间隔.m_bCanFire; /表示判断是否开火2. 子弹类CBullet:m_iType; /表示该子弹是谁发射的变量3. 敌方战机类CEnemyFighter:m_fCreateTime;/ 创建敌机的时间见隔m_iCreatedSpriteCount;/表示创建战机数量m_fCanFireAfterCreated; /判断敌机创建后能否开火m_fBulletCreateTime; /子弹发射时间间隔m_fFloatTime; /战机飞行时上下浮动。

4、的时间间隔m_bFloatUp; /战机飞行时是上浮还是下浮4.链表类CSpriteList:structSpriteStruct /一个精灵结构体SpriteStruct;CSprite*pSprite; SpriteStruct*pNext; SpriteStruct*pPrev; ;SpriteStruct *m_pListHeader; /一个头节点指针int m_iListSize; /表示链表节点数的私有成员变量CSprite*m_pSpriteList; /精灵指针5. 精灵父类CGameSprite:virtualCGameSprite(); /get方法6. lessen.x。

5、类:m_iGameState; / 游戏状态0:结束或者等待开始1:初始化2游戏进行中.CSprite*m_pGameBegin; /游戏开始文字精灵 CMyFighter* m_pMyFighter; /战机类指针float m_iCreatedSpriteCount; /创造精灵数量CSpriteList m_SpriteList; /链表类精灵CSpriteList diji; /链表类敌机CEffect* die_texiao; /特效类精灵5. 算法描述在外星球上,玩家通过键盘WSAD键控制己方战机,通过空格键发射子弹消灭外星球的邪恶战机。游戏状态m_iGameState分为三种状态。

6、0,1,2 ,其中0表示游戏结束状态,1表示游戏初始化,2则表示游戏运行状态;0 1的转换为“空格开始”,初始化函数为GameInit函数;播放背景音乐。1 2的转换自然发生,即游戏初始化函数后会自动将游戏状态从1置为22 表示游戏运行状态,在该状态,敲击空格发射子弹消灭敌机,消灭敌机分数增加,被敌机打中自身的血量减少。2 0的转换是游戏结束。CGameMain:CGameMain()构造函数完成初始化工作初始化状态为0设置开始按钮我方战机初始化为空创造精灵数量初始化为0CGameMain:GameMainLoop(floatfDeltaTime )游戏的主循环,根据游戏的状态切换逻辑1、 当。

7、当游戏状态为0时,主循环一直循环,但不做处理,而是等待空格键按下,开始游戏。调用背景音乐。2、 当游戏状态为1时,调用GameInit()方法初始化游戏,然后置游戏状态为2。当游戏状态为2时,调用GameRun(fDeltaTime)方法,在CGameMain类的GameRun方法中,遍历链接中的每个节点,获得所有敌方战机的节点,让战机执行LoopTick方法,实现战机发射子弹和上下浮动。3、 游戏结束时会执行GameEnd且置状态为0。CGameMain:GameInit()完成对各种精灵的初始化1. 播放放在bin中的游戏背景音乐。2. 初始化我方战机为战机类指针”ControlSprit。

8、e”.设计我方战机的世界边界限制。3. 初始化分数为0.4. 初始化血量为100.CGameMain:GameRun(floatfDeltaTime )对于游戏进行的设置1.如果是我的战机,我方战机初始化2.敌方战机引用函数CEnemyFighter:ClassTick( fDeltaTime )进行引用。3.当游戏状态为2时,调用GameRun(fDeltaTime)方法,在CGameMain类的GameRun方法中,遍历链接中的每个节点,获得所有敌方战机的节点,让战机执行LoopTick方法,实现战机发射子弹和上下浮动。CGameMain:OnKeyDown(constintiKey,co。

9、nstboolbAltPress, constboolbShiftPress, constboolbCtrlPress )游戏开始和控制按钮1、 如果空格按下时,游戏未开始,即游戏状态为0,则将游戏状态改为1,运行游戏初始化函数(GameInit)。隐藏文字精灵“开始游戏”。2、 如果游戏状态是2时,设置战机移动,调用函数OnMove3、 如果空格按下时,战机为空。则调用函数SetCanFire,按下空格键即可发送子弹。void CGameMain:OnSpriteColSprite( const char *szSrcName, const char *szTarName )设置碰撞的发送方。

10、与接收方1. 调用匹配函数cemcmp(szSrcName,”,strlen(“”)=0),如果对象是子弹则继续判断2. 假若是我方战机被子弹击中则血量减少0.5.显示当前血量。3. 假如是对方战机被击中,则得分增加10分,更新显示我方分数。void CMyFighter:OnMove(bool bKeyDown, int iKey)设置战机飞行速度编写CMyFighter类OnMove方法代码。首先判断当前按键是按下还是松开的,其次判断是哪个按键的消息,根据这两个判断,为4个方向的速度矢量赋值。再次算出X后和Y轴上的速度,并设置战机的速度。m_pMyFighter-SetSpriteWorl。

11、dLimit(WORLD_LIMIT_STICKY,CSystem:GetScreenLeft()-10.f,CSystem:GetScreenTop(),CSystem:GetScreenRight() + 200.f, )设置战机的世界边界其次在构造函数中将m_pMyFighter赋予NULL的初始值。再次在GameInit方法中初始化m_pMyFighter。因为我们用new方法创建了m_pMyFighter对象,分配了内存,所以我们在CGameMain类的析构函数中需要调用delete方法将 m_pMyFighter使用的内存释放掉。m_CurScoreText-SetTextValu。

12、e(0);m_MaxScoreText-SetTextValue(0);/更新当前等级/HP显示在CGameMain类的GameInit方法中显示当前积分和最高积分 void CMyFighter:LoopTick( float fDeltaTime )/ 处理子弹的发射CMyFighter添加m_fBulletCreateTime,表示子弹的发射间隔,注意在构造函数中初始化为0.3。然后添加LoopTick方法,处理子弹的发射。参数为游戏的时间间隔;void CGameMain:CreateBullet( const float fPosX, const float fPosY )CGame。

13、Main类中添加m_iCreatedSpriteCount属性,表示游戏中发射子弹的数目注意在构造函数中初始化为0。然后添加CreateBullet方法,参数为子弹的X轴和Y轴坐标。并在该方法中创建一个子弹类,并设置子弹的位置和速度。因为模板子弹的方向是朝左,所以需要设置子弹按X轴对称旋转;IntiPosBase=CSystem:RandomRange(int)CSystem:GetScreenTop()+10,(int)CSystem:GetScreenBottom() - 10);创建战机时,只需要战机不显示在世界边界之外就可以,即Y轴坐标在比世界边界的上下边界稍微大一点的范围之间,在此我。

14、们设置比世界边界大10个世界坐标单位。void CEnemyFighter:LoopTick( float fDeltaTime )在函数中添加代码,当表示战机创建之后,隔多久才可以开始发射子弹的变量递减到小于等于0时,开始可以创建子弹,然后开始递减子弹的发射间隔变量,当递减到小于等于0时,战机发射子弹。if( m_bFloatUp )添加战机上下浮动的代码。当战机浮动时,首先累计浮动的时间,当浮动时间大于1和小于0时,修改上浮还是下浮的变量值。然后获得战机此时的Y轴坐标,我们设置上下浮动的速度为6,这样就可以计算出浮动后的Y轴坐标。void CGameMain:CreateBullet( i。

15、nt iType, const float fPosX, const float fPosY )为CBullet添加一个表示该子弹是谁发射的变量。if( 1 = iType ) /如果iType值为1,则说明子弹为敌方战机反射。SpriteStruct *CSpriteList:AddSprite( CSprite *pSprite )为链接类添加增加节点的方法void CSpriteList:DeleteSprite( const char *szName, bool bDeleteImage ) 添加根据精灵名称删除其在链接中的节点的方法。其中第二个参数表示是否将其在游戏中的精灵也删除。C。

16、Sprite *CSpriteList:GetSprite( const int iIndex )添加获得链接中某个节点的方法。首先根据索引获得精灵。void CSpriteList:DeleteSprite( const char *szName, bool bDeleteImage )根据名字删除精灵void CSpriteList:DeleteSprite( CSprite *pSprite, bool bDeleteImage )根据精灵对象删除精灵源代码Lessenx.hpublic:CGameMain(); /构造函数CGameMain(); /析构函数 / Get方法intGet。

17、GameState() return m_iGameState; / Set方法voidSetGameState( const int iState ) m_iGameState=iState; / 游戏主循环等voidGameMainLoop( floatfDeltaTime );voidGameInit();voidGameRun( float fDeltaTime );voidGameEnd();/ 事件函数void OnMouseMove( const float fMouseX, const float fMouseY );void OnMouseClick( const int i。

18、MouseType, const float fMouseX, const float fMouseY );void OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress );void OnKeyUp( const int iKey );void OnSpriteColSprite( const char *szSrcName, const char *szTarName );void OnSpriteColWorldLimit( const char *sz。

19、Name, const int iColSide );void CreateBullet( int iType, const float fPosX, const float fPosY );void AddSprite( CSprite *pSprite );CSprite* GetSprite(const char *szName)return m_SpriteList.GetSprite(szName);void DeleteSprite( CSprite *pSprite, bool bDeleteImage )m_SpriteList.DeleteSprite(pSprite,bDe。

20、leteImage);/ extern CGameMaing_GameMain;#endif / _LESSON_X_H_Lessenx.cpp/#include #include CommonClass.h#includeCSpriteList.h#include LessonX.h#includeCBullet.h#includeCEnemyFighter.h#include int a=100,b=0;CTextSprite* g_CurScoreText=new CTextSprite(CurScoreText);/显示当前积分CTextSprite* g_MaxScoreText=n。

21、ew CTextSprite(MaxScoreText);/ 显示最高分/CEffect* die_texiao=new CEffect(playerExplode);/CGameMaing_GameMain;/=/ 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。/=/ 构造函数CGameMain:CGameMain()m_iGameState=0;m_pGameBegin=new CSprite(GameBegin);m_pMyFighter=NULL;m_iCreatedSpriteCount=0;/=/ 析构函数CGameMain。

22、:CGameMain()delete m_pMyFighter;/=/ 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次/ 用以处理游戏的开始、进行中、结束等各种状态. / 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒void CGameMain:GameMainLoop( floatfDeltaTime )switch( GetGameState() )/ 初始化游戏,清空上一局相关数据case 1:GameInit();SetGameState(2); / 初始化之后,将游戏状态设置为进行中break;/ 游戏进行中,处理各种。

23、游戏逻辑case 2:/ TODO 修改此处游戏循环条件,完成正确游戏逻辑if( true )GameRun( fDeltaTime );else / 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态SetGameState(0);GameEnd();break;/ 游戏结束/等待按空格键开始case 0:default:break;/=/ 每局开始前进行初始化,清空上一局相关数据void CGameMain:GameInit()PlaySound(yinyue,0,SND_FILENAME|SND_ASYNC|SND_LOOP);m_pMyFighter=NULL;if( NULL =。

24、 m_pMyFighter )m_pMyFighter=new CMyFighter(ControlSprite);m_pMyFighter-SetSpriteWorldLimit(WORLD_LIMIT_STICKY,CSystem:GetScreenLeft()-10.f,CSystem:GetScreenTop(),CSystem:GetScreenRight() + 200.f, CSystem:GetScreenBottom();g_CurScoreText-SetTextValue(100);g_MaxScoreText-SetTextValue(0);/=/ 每局游戏进行中voi。

25、d CGameMain:GameRun( float fDeltaTime )if( m_pMyFighter )m_pMyFighter-LoopTick( fDeltaTime );CEnemyFighter:ClassTick( fDeltaTime );intiListSize=m_SpriteList.GetListSize();for( int iLoop = 0; iLoop LoopTick( fDeltaTime );/=/ 本局游戏结束void CGameMain:GameEnd()void CGameMain:OnMouseMove( const float fMouse。

26、X, const float fMouseY )void CGameMain:OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )void CGameMain:OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )if( KEY_SPACE = iKey & 0 = m_iGameState )m_iGameState=1;m_pGameBegin-Set。

27、SpriteVisible(0);if( 2 = GetGameState() ) /当游戏状态为2时m_pMyFighter-OnMove(true,iKey);if( KEY_SPACE = iKey & NULL != m_pMyFighter )m_pMyFighter-SetCanFire(true );void CGameMain:OnKeyUp( const int iKey )if( 2 = GetGameState() )m_pMyFighter-OnMove(false,iKey);if( KEY_SPACE = iKey & NULL != m_pMyFighter )m。

28、_pMyFighter-SetCanFire( false );void CGameMain:OnSpriteColSprite( const char *szSrcName, const char *szTarName )/ 如果子弹if(memcmp(szSrcName,Bullet1_,strlen(Bullet1_)=0)if(memcmp(szTarName,ControlSprite,strlen(ControlSprite)=0)a=a-0.5;g_CurScoreText-SetTextValue(a);/CSprite*pSrcSprite=g_GameMain.GetSpr。

29、ite( szSrcName );/m_SpriteList.DeleteSprite(pSrcSprite,true);if(memcmp(szTarName,Horizont,strlen(Horizont)=0)b=b+10;g_MaxScoreText-SetTextValue(b);g_GameMain.DeleteSprite(g_GameMain.GetSprite(szTarName),true );void CGameMain:OnSpriteColWorldLimit( const char *szName, const int iColSide )void CGameMa。

30、in:CreateBullet( int iType, const float fPosX, const float fPosY )charszNameMAX_NAME_LEN;/ MAX_NAME_LE为CommonClass.h中宏定义 值为128sprintf( szName, Bullet1_%d, m_iCreatedSpriteCount );m_iCreatedSpriteCount+;CBullet *pBullet = new CBullet( iType,szName);pBullet-CloneSprite( Bullet1_Template );pBullet-SetS。

31、pritePosition( fPosX, fPosY );pBullet-SetSpriteLinearVelocityX( 60 );pBullet-SetSpriteWorldLimit(WORLD_LIMIT_NULL,CSystem:GetScreenLeft()-10.f,CSystem:GetScreenTop(),CSystem:GetScreenRight() + 200.f, CSystem:GetScreenBottom();if( 1 = iType ) /如果iType值为1,则说明子弹为敌方战机反射。pBullet-SetSpriteLinearVelocityX(。

32、 -30 );else/其他情况说明为我方战机反射pBullet-SetSpriteFlipX( true );pBullet-SetSpriteLinearVelocityX( 60 );float CEnemyFighter:m_fCreateTime = 0.f;int CEnemyFighter:m_iCreatedSpriteCount = 0;void CGameMain:AddSprite( CSprite *pSprite )m_SpriteList.AddSprite( pSprite );Myfighter.h#ifndef _CMYFIGHT_H#define _CMYF。

33、IGHT_H#include commonclass.hclass CMyFighter :public CSpriteprivate:floatm_fVelocityLeft;/ 控制飞机的上下左右速度floatm_fVelocityRight;floatm_fVelocityUp;floatm_fVelocityDown;float m_fBulletCreateTime;bool m_bCanFire;public:CMyFighter (const char* szName);CMyFighter(void);void OnMove(bool bKeyDown, int iKey);v。

34、oid SetCanFire( const bool bCan ) m_bCanFire = bCan; void CMyFighter:LoopTick( float fDeltaTime );#endifMyfighter.cpp#include .HeaderCMyFighter.h#includeLessonX.hCMyFighter: CMyFighter (const char* szName):CSprite(szName) /对构造函数进行实现floatm_fVelocityLeft;/ 控制飞机的上下左右速度floatm_fVelocityRight;floatm_fVelo。

35、cityUp;floatm_fVelocityDown;m_fVelocityLeft =0.f;m_fVelocityRight=0.f;m_fVelocityUp=0.f;m_fVelocityDown=0.f;m_fBulletCreateTime=0.3f;void CMyFighter:OnMove(bool bKeyDown, int iKey)if(bKeyDown)switch(iKey)case KEY_A: / 左m_fVelocityLeft =30.f;break;case KEY_D: / 右m_fVelocityRight =30.f;break;case KEY_。

36、W: / 上m_fVelocityUp =15.f;break;case KEY_S: / 下m_fVelocityDown =15.f;break;elseswitch(iKey)case KEY_A: / 左m_fVelocityLeft =0.f;break;case KEY_D: / 右m_fVelocityRight =0.f;break;case KEY_W: / 上m_fVelocityUp =0.f;break;case KEY_S: / 下m_fVelocityDown =0.f;break;float fVelX= m_fVelocityRight - m_fVelocit。

37、yLeft;float fVelY = m_fVelocityDown - m_fVelocityUp;SetSpriteLinearVelocity( fVelX,fVelY );/ 处理子弹的发射void CMyFighter:LoopTick( float fDeltaTime )m_fBulletCreateTime-= fDeltaTime;if( m_fBulletCreateTime #includeLessonX.hCEnemyFighter:CEnemyFighter(const char* szName):CSprite(szName)m_fBulletCreateTime。

38、=0.3;m_fFloatTime=0.5;m_bFloatUp=true;CEnemyFighter:CEnemyFighter(void)void CEnemyFighter:ClassTick( float fDeltaTime ) /创建敌方战机/ 是否到时间创建m_fCreateTime -= fDeltaTime;if( m_fCreateTime CloneSprite( HorizontalSprite_Template ); /克隆模板intiRandom=CSystem:RandomRange( iPosBase - 10, iPosBase + 10 ); floatfP。

39、osX=(int)CSystem:GetScreenRight() + 20.f;pSprite-SetSpritePosition( fPosX, (float)iRandom );pSprite-SetSpriteLinearVelocityX( -10.f );pSprite-SetSpriteWorldLimit(WORLD_LIMIT_NULL, CSystem:GetScreenLeft()-10.f,CSystem:GetScreenTop(),CSystem:GetScreenRight() + 200.f, CSystem:GetScreenBottom() );g_Game。

40、Main.AddSprite(pSprite);/在以下添加创建一架敌方战机的代码void CEnemyFighter:LoopTick( float fDeltaTime )m_fCanFireAfterCreated -= fDeltaTime;if( m_fCanFireAfterCreated = 1.f )m_bFloatUp = false;floatfPosY=GetSpritePositionY();fPosY+=6.f * fDeltaTime;SetSpritePositionY( fPosY );elsem_fFloatTime -= fDeltaTime;if( m_f。

41、FloatTime pSprite=pSprite;pPtr-pNext=NULL;pPtr-pPrev=NULL;/ 插入链表表尾if( NULL = m_pListHeader )m_pListHeader=pPtr;elseSpriteStruct*pTemp=m_pListHeader;while( NULL != pTemp-pNext )pTemp=pTemp-pNext;pPtr-pPrev=pTemp;pTemp-pNext=pPtr;m_iListSize+;return pPtr;void CSpriteList:DeleteSprite( const char *szNa。

42、me, bool bDeleteImage )SpriteStruct*pPtr=NULL;for( pPtr=m_pListHeader; NULL != pPtr; pPtr=pPtr-pNext )if( strcmp( szName, pPtr-pSprite-GetName() ) = 0 )/ 将本指针从链表中取出(即将链表中的前后指针重新指定)/ 假设目前链表如下:有ABC三个值,A B C,需要删除B/ 则需要将A的Next指向C,C的Prev指向A,删除后结果为A Cif( NULL != pPtr-pNext )pPtr-pNext-pPrev=pPtr-pPrev;if(。

43、 NULL != pPtr-pPrev )pPtr-pPrev-pNext=pPtr-pNext;/ 如果是表头if( pPtr = m_pListHeader )m_pListHeader=m_pListHeader-pNext;/ 删除Spriteif( bDeleteImage )pPtr-pSprite-DeleteSprite();/ 释放内存delete pPtr;m_iListSize-;return;CSprite *CSpriteList:GetSprite( const int iIndex )intiLoop=0;SpriteStruct*pPtr=m_pListHeader;while( NULL != pPtr )if( iLoop = iIndex )return pPtr-pSprite;iLoop+;pPtr=pPtr-pNext;return NULL。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值