700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 太空战机c语言实验报告 太空战机试验报告资料

太空战机c语言实验报告 太空战机试验报告资料

时间:2022-08-21 14:57:45

相关推荐

太空战机c语言实验报告 太空战机试验报告资料

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

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

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

3、. 我方战机类 CMyFighter : m_fVelocityLeft; / 控制飞机飞行的速度上下左右。 m_fVelocityRight; m_fVelocityUp; m_fVelocityDown; m_fBulletCreateTime; /表示子弹的发射间隔 m_bCanFire; 2. 子弹类 CBullet : /表示判断是否开火 m_iType;/ 表示该子弹是谁发射的变量 3. 敌方战机类 CEnemyFighter: m_fCreateTime; / 创建敌机的时间见隔 m_iCreatedSpriteCount;/表示创建战机数量 m_fCanFireAfterCre。

4、ated; /判断敌机创建后能否开火 m_fBulletCreateTime; m_fFloatTime; m_bFloatUp; 4. 链表类 CSpriteList: struct SpriteStruct CSprite *pSprite; SpriteStruct *pNext; SpriteStruct *pPrev; ; SpriteStruct *m_pListHeader; int m_iListSize; CSprite*m_pSpriteList; 5. 精灵父类 CGameSprite: /子弹发射时间间隔 /战机飞行时上下浮动的时间间隔 /战机飞行时是上浮还是下浮 /一。

5、个精灵结构体 SpriteStruct; /一个头节点指针 /表示链表节点数的私有成员变量 /精灵指针 /get 方法 virtualCGameSprite(); 6.lessen.x类: / 游戏状态 0:结束或者等待开始 1: m_iGameState; 初始化 2 游戏进行中 . CSprite* m_pGameBegin; / 游戏开始文字精灵 CMyFighter* m_pMyFighter;/战机类指针 float m_iCreatedSpriteCount;/ 创造精灵数量 CSpriteList m_SpriteList; / 链表类精灵 CSpriteList diji;/ 。

6、链表类敌机 CEffect* die_texiao;/特效类精灵 5. 算法描述 在外星球上,玩家通过键盘 WSAD 键控制己方战机,通过空格 键发射子弹消灭外星球的邪恶战机。 游戏状态 m_iGameState分为三种状态 0, 1,2 ,其中 0 表示游 戏结束状态, 1 表示游戏初始化, 2 则表示游戏运行状态; 0 1 的转换为“空格开始” ,初始化函数为 GameInit 函数; 播放背景音乐。 1 2 的转换自然发生,即游戏初始化函数后会自动将游戏状态 从 1 置为 2 2 表示游戏运行状态,在该状态,敲击空格发射子弹消灭敌机, 消灭敌机分数增加,被敌机打中自身的血量减少。 2 0。

7、 的转换是游戏结束。 CGameMain:CGameMain() 构造函数 完成初始化工作 初始化状态为 0 设置开始按钮 我方战机初始化为空 创造精灵数量初始化为 0 CGameMain:GameMainLoop(float fDeltaTime ) 游戏的主循环,根据游戏的状态切换逻辑 1、当当游戏状态为 0 时,主循环一直循环,但不做处理,而是等 待空格键按下,开始游戏。调用背景音乐。 2、当游戏状态为 1 时,调用 GameInit()方法初始化游戏,然后置 游戏状态为 2。当游戏状态为 2 时,调用 GameRun(fDeltaTime) 方法,在 CGameMain 类的 Game。

8、Run方法中,遍历链接中的每 个节点,获得所有敌方战机的节点, 让战机执行 LoopTick 方法, 实现战机发射子弹和上下浮动。 3、游戏结束时会执行 GameEnd且置状态为 0 CGameMain:GameInit() 完成对各种精灵的初始化 1. 播放放在 bin 中的游戏背景音乐。 2. 初始化我方战机为战机类指针 ”ControlSprite”.设计我方战机的世界 边界限制。 3. 初始化分数为 0. 4. 初始化血量为 100. CGameMain:GameRun(floatfDeltaTime ) 对于游戏进行的设置 1. 如果是我的战机,我方战机初始化 2. 敌方战机引用函数。

9、 CEnemyFighter:ClassTick( fDeltaTime ) 进行 引用。 3. 当游戏 状态为 2 时,调 用 GameRun(fDeltaTime)方法,在 CGameMain 类的 GameRun 方法中,遍历链接中的每个节点,获 得所有敌方战机的节点,让战机执行 LoopTick 方法,实现战机发 射子弹和上下浮动。 CGameMain:OnKeyDown(constintiKey,constboolbAltPress, constboolbShiftPress, constboolbCtrlPress ) 游戏开始和控制按钮 1、如果空格按下时,游戏未开始,即游戏状态。

10、为 0,则将游戏状 态改为 1,运行游戏初始化函数( GameInit)。隐藏文字精灵“开始游 戏”。 2、如果游戏状态是 2 时,设置战机移动,调用函数 OnMove 3、如果空格按下时 ,战机为空。则调用函数 SetCanFire,按下空格 键即可发送子弹。 void CGameMain:OnSpriteColSprite( const char *szSrcName, const char *szTarName ) 设置碰撞的发送方与接收方 1. 调用匹配函数 cemcmp(szSrcName”, ,”strlen(“)”)=0), 如果对象是子 弹则继续判断 2. 假若是我方战机被子弹。

11、击中则血量减少 0.5.显示当前血量。 3. 假如是对方战机被击中,则得分增加 10 分,更新显示我方分数。 void CMyFighter:OnMove(bool bKeyDown, int iKey) 设置战机飞行速度 编写 CMyFighter 类 OnMove 方法代码。首先判断当前按键是按下 还是松开的,其次判断是哪个按键的消息,根据这两个判断,为 4 个方向的速度矢量赋值。再次算出 X 后和 Y 轴上的速度,并设 置战机的速度。 m_pMyFighter-SetSpriteWorldLimit(WORLD_LIMIT_ST ICKY,CSystem:GetScreenLeft()-。

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

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

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

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

16、就可以计 算出浮动后的 Y 轴坐标。 void CGameMain:CreateBullet( int iType, const float fPosX, const float fPosY ) if( 1 = 为 CBullet 添加一个表示该子弹是谁发射的变量 iType ) /如果 iType值为 1,则说明子弹为敌方战机反射 SpriteStruct *CSpriteList:AddSprite( CSprite *pSprite ) 为链接类添加增加节点的方法 void CSpriteList:DeleteSprite( const char *szName, bool bDelet。

17、eImage ) 添加根据精灵名称删除其在链接中的节点的方法。 其中第二个参数表 示是否将其在游戏中的精灵也删除。 CSprite *CSpriteList:GetSprite( const int iIndex ) 添加获得链接中某个节点的方法。首先根据索引获得精灵。 void CSpriteList:DeleteSprite( const char *szName, bool bDeleteImage ) 根据名字删除精灵 bool void CSpriteList:DeleteSprite( CSprite *pSprite, bDeleteImage ) 根据精灵对象删除精灵 源代码 。

18、Lessenx.h public: CGameMain(); /构造函数 CGameMain();/析构函数 / Get 方法 int GetGameState() return m_iGameState; / Set 方法 void SetGameState( const int iState ) m_iGameState = iState; / 游戏主循环等 void GameMainLoop( float fDeltaTime ); void GameInit(); void GameRun( float fDeltaTime ); void GameEnd(); / 事件函数 void。

19、 OnMouseMove( const float fMouseX, const float fMouseY ); void OnMouseClick( const int iMouseType, 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。

20、( const char *szSrcName, const char *szTarName ); void OnSpriteColWorldLimit( const char *szName, 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。

21、); void DeleteSprite( CSprite *pSprite, bool bDeleteImage )m_SpriteList.DeleteSprite(pSprite,bDeleteImage); ; / / extern CGameMain g_GameMain; #endif / _LESSON_X_H_ 三三三三三三三三三三三三三三三三三三三三三三三三三三一_ Fa)po_dx 山 AQd.No匸山 0 M UHOQXS一 p *40匸山 CW Q恤唳低国 注CX J.oosxelAL)七d52x J_o m UJLX j_ 00sxelAII6 *9一d52x J_o。

22、 =-CX 一 8sno七d$2x _L0 m UJLX -8snol6 *9一d52x -L0 oHqoOLHe 茎一 ALT64SV pn OUS !:茎6匚Auju山。Qpn OUS i:a=n89 pn ous UXUOSS _! pn ous =lnsn 七dso.Qpnous =lrsseoUOLULUO9 pnous 仝OP4SV pnou 丑 三三三三三三三三三三三三三三三三三三三三三三三三三三三 = = 三三三三三三三三三三三三三三三三三三三三三三三三三三三 dch.xuessej / / CGameMain g_GameMain; /= / / 大体的程序流程为: Game。

23、MainLoop 函数为主循环函数, 在引擎每 帧刷新屏幕图像之后,都会被调用一次。 /= / / 构造函数 CGameMain:CGameMain() m_iGameState= 0; m_pGameBegin= new CSprite(GameBegin); m_pMyFighter=NULL; m_iCreatedSpriteCount=0; /= / / 析构函数 CGameMain:CGameMain() delete m_pMyFighter; /= / / 游戏主循环, 此函数将被不停的调用, 引擎每刷新一次屏幕, 此函 数即被调用一次 / 用以处理游戏的开始、进行中、结束等各种。

24、状态 . / 函数参数 fDeltaTime : 上次调用本函数到此次调用本函数的时间 间隔,单位:秒 void CGameMain:GameMainLoop( float fDeltaTime ) switch( GetGameState() ) / 初始化游戏,清空上一局相关数据 case 1: GameInit(); SetGameState(2); / 初始化之后, 将游戏状态设置为进行中 break; / 游戏进行中,处理各种游戏逻辑 case 2: / TODO 修改此处游戏循环条件,完成正确游戏逻辑 if( true ) GameRun( fDeltaTime ); else /。

25、 游戏结束。调用游戏结算函数,并把游戏状态修改 为结束状态 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 = m_pMyFighter ) m_pMyFighter new CMyFighter(ControlSpri。

26、te); m_pMyFighter-SetSpriteWorldLimit(WORLD_LIMIT_STICKY ,CSyste m:GetScreenLeft()-10.f,CSystem:GetScreenTop(),CSystem:GetScreen Right() + 200.f, CSystem:GetScreenBottom(); g_CurScoreText-SetTextValue(100); g_MaxScoreText-SetTextValue(0); /= / / 每局游戏进行中 void CGameMain:GameRun( float fDeltaTime ) if(。

27、 m_pMyFighter ) m_pMyFighter-LoopTick( fDeltaTime ); CEnemyFighter:ClassTick( fDeltaTime ); int iListSize = m_SpriteList.GetListSize(); for( int iLoop = 0; iLoop LoopTick( fDeltaTime ); /= / / 本局游戏结束 void CGameMain:GameEnd() void CGameMain:OnMouseMove( const float fMouseX, const float fMouseY ) void。

28、 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 m_pGameBegin-SetSpriteVisible(0); if( 2 = GetGameState() ) /当游戏状态为 2 时 m_pMyF。

29、ighter-OnMove(true,iKey); if( KEY_SPACE = iKey void CGameMain:OnKeyUp( const int iKey ) if( 2 = GetGameState() ) m_pMyFighter-OnMove(false,iKey); if( KEY_SPACE = iKey void CGameMain:OnSpriteColSprite( const char *szSrcName, const char *szTarName ) / 如果子弹 if(memcmp(szSrcName,Bullet1_,strlen(Bullet1_)。

30、=0) if(memcmp(szTarName,ControlSprite,strlen(ControlSprite)=0) a=a-0.5; g_CurScoreText-SetTextValue(a); /CSprite *pSrcSprite = g_GameMain.GetSprite( szSrcName ); /m_SpriteList.DeleteSprite(pSrcSprite,true); if(memcmp(szTarName,Horizont,strlen(Horizont)=0) b=b+10; g_MaxScoreText-SetTextValue(b); g_Ga。

31、meMain.DeleteSprite(g_GameMain.GetSprite(szTarName),true ); void CGameMain:OnSpriteColWorldLimit( const char *szName, const int iColSide ) void CGameMain:CreateBullet( int iType, const float fPosX, const float fPosY ) char szNameMAX_NAME_LEN;/ MAX_NAME_LE 为 CommonClass.h中宏定义 值为 128 sprintf( szName, 。

32、Bullet1_%d, m_iCreatedSpriteCount ); m_iCreatedSpriteCount+; CBullet *pBullet = new CBullet( iType,szName); pBullet-CloneSprite( Bullet1_Template ); pBullet-SetSpritePosition( fPosX, fPosY ); pBullet-SetSpriteLinearVelocityX( 60 ); pBullet-SetSpriteWorldLimit(WORLD_LIMIT_NULL,CSystem:GetSc reenLeft(。

33、)-10.f,CSystem:GetScreenTop(),CSystem:GetScreenRight() + 200.f, CSystem:GetScreenBottom(); if( 1 = iType ) /如果 iType 值为 1,则说明子弹为敌方战机 反射。 pBullet-SetSpriteLinearVelocityX( -30 ); else/其他情况说明为我方战机反射 pBullet-SetSpriteFlipX( true ); pBullet-SetSpriteLinearVelocityX( 60 ); float CEnemyFighter:m_fCreateTi。

34、me = 0.f; int CEnemyFighter:m_iCreatedSpriteCount = 0; void CGameMain:AddSprite( CSprite *pSprite ) m_SpriteList.AddSprite( pSprite ); Myfighter.h #ifndef _CMYFIGHT_H #define _CMYFIGHT_H #include commonclass.h class CMyFighter :public CSprite private: float m_fVelocityLeft; / 控制飞机的上下左右速 float m_fVel。

35、ocityRight; float m_fVelocityUp; float m_fVelocityDown; float m_fBulletCreateTime; bool m_bCanFire; public: CMyFighter (const char* szName); CMyFighter(void); void OnMove(bool bKeyDown, int iKey); m_bCanFire = void SetCanFire( const bool bCan ) bCan; void CMyFighter:LoopTick( float fDeltaTime ); ; #。

36、endif Myfighter.cpp #include .HeaderCMyFighter.h #includeLessonX.h CMyFighter: CMyFighter (const char* szName):CSprite(szName) / 对 构造函数进行实现 / 控制飞机的上下左右速 floatm_fVelocityLeft; 度 floatm_fVelocityRight; floatm_fVelocityUp; floatm_fVelocityDown; m_fVelocityLeft =0.f; m_fVelocityRight =0.f; m_fVelocityUp。

37、 =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_W: / 上 m_fVelocityUp = 15.f; break; case KEY_S: / 下 m_fVelocityDow。

38、n = 15.f; break; else switch(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_fVelocityLeft; float fVelY = m_fVelocityDown - 。

39、m_fVelocityUp; SetSpriteLinearVelocity( fVelX,fVelY ); / 处理子弹的发射 void CMyFighter:LoopTick( float fDeltaTime ) m_fBulletCreateTime -= fDeltaTime; if( m_fBulletCreateTime = 0.f g_GameMain.CreateBullet(0,GetSpritePositionX()+9, GetSpritePositionY() ); CMyFighter:CMyFighter(void) Cbullet.h #include comm。

40、onclass.h class CBullet :public CSprite private: int m_iType; public: CBullet(const int iType, const char *szName); CBullet(); bool IsMyBullet(); ; Cbullet.cpp #include .HeaderCBullet.h *szName) CBullet:CBullet(const int iType, const char CSprite( szName ) m_iType = iType; CBullet:CBullet(void) bool。

41、 CBullet:IsMyBullet() if(m_iType=0) return true; return false; CenmeyFighter.h #include commonclass.h class CEnemyFighter :public CSprite private: static float m_fCreateTime; / 创建敌机的时间间隔 static int m_iCreatedSpriteCount;/表示创建战机数量 float m_fCanFireAfterCreated; float m_fBulletCreateTime; float m_fFloa。

42、tTime; bool m_bFloatUp; public: CEnemyFighter(const char* szName); CEnemyFighter(void); void static ClassTick( float fDeltaTime ); void LoopTick( float fDeltaTime ); ; CenmeyFighter.cpp #include .HeaderCEnemyFighter.h #include #includeLessonX.h CEnemyFighter:CEnemyFighter(const char* szName):CSprite。

43、(szName) m_fBulletCreateTime=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 ); / 克隆 模板 int iRandom = CSystem:RandomRang。

44、e( iPosBase - 10, iPosBase + 10 ); float fPosX = (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:Get ScreenRi。

45、ght() + 200.f, CSystem:GetScreenBottom() ); g_GameMain.AddSprite(pSprite); /在以下添加创建一架敌方战机的代码 void CEnemyFighter:LoopTick( float fDeltaTime ) m_fCanFireAfterCreated -= fDeltaTime; if( m_fCanFireAfterCreated = 0.f ) m_fBulletCreateTime -= fDeltaTime; if( m_fBulletCreateTime = 1.f ) m_bFloatUp = false;。

46、 float fPosY = GetSpritePositionY(); fPosY += 6.f * fDeltaTime; SetSpritePositionY( fPosY ); else m_fFloatTime -= fDeltaTime; if( m_fFloatTime pSprite = pSprite; pPtr-pNext= NULL; pPtr-pPrev= NULL; / 插入链表表尾 if( NULL = m_pListHeader ) m_pListHeader = pPtr; else SpriteStruct *pTemp = m_pListHeader; wh。

47、ile( NULL != pTemp-pNext ) pTemp = pTemp-pNext; pPtr-pPrev pTemp; pTemp-pNext pPtr; m_iListSize+; return pPtr; void CSpriteList:DeleteSprite( const char *szName, bool bDeleteImage ) SpriteStruct *pPtr = NULL; for( pPtr = m_pListHeader; NULL != pPtr; pPtr = pPtr-pNext ) if( strcmp( szName, pPtr-pSpri。

48、te-GetName() ) = 0 ) / 将本指针从链表中取出 (即将链表中的前后指针重新指 定) / 假设目前链表如下:有 ABC 三个值, A B C,需 要删除 B / 则需要将 A 的 Next 指向 C,C 的 Prev 指向 A,删除后 结果为 A C if( NULL != pPtr-pNext ) pPtr-pNext-pPrev = pPtr-pPrev; if( NULL != pPtr-pPrev ) pPtr-pPrev-pNext = pPtr-pNext; / 如果是表头 if( pPtr = m_pListHeader ) m_pListHeader = m_。

49、pListHeader-pNext; / 删除 Sprite if( bDeleteImage ) pPtr-pSprite-DeleteSprite(); / 释放内存 delete pPtr; m_iListSize-; return; CSprite *CSpriteList:GetSprite( const int iIndex ) int iLoop = 0; SpriteStruct *pPtr = m_pListHeader; while( NULL != pPtr ) if( iLoop = iIndex ) return pPtr-pSprite; iLoop+; pPtr 。

50、= pPtr-pNext; return NULL; CSprite*CSpriteList:GetSprite( const char *szName ) SpriteStruct *pPtr = m_pListHeader; while( NULL != pPtr ) if( strcmp( pPtr-pSprite-GetName(), szName ) = 0 ) return pPtr-pSprite; pPtr pPtr-pNext; return NULL; *pSprite, bool void CSpriteList:DeleteSprite( CSprite bDelete。

51、Image ) SpriteStruct *pPtr = NULL; pPtr-pNext ) for( pPtr = m_pListHeader; NULL != pPtr; pPtr if( pPtr-pSprite = pSprite ) if( NULL != pPtr-pNext ) pPtr-pNext-pPrev = pPtr-pPrev; if( NULL != pPtr-pPrev ) pPtr-pPrev-pNext = pPtr-pNext; if( pPtr = m_pListHeader ) m_pListHeader m_pListHeader-pNext; if(。

52、 bDeleteImage ) pPtr-pSprite-DeleteSprite(); delete pPtr; m_iListSize-; return; void CSpriteList:DeleteAllSprite( bool bDeleteImage ) SpriteStruct *pPtr = NULL; SpriteStruct *pPtrhNext = m_pListHeader; while( NULL != pPtrhNext ) pPtr = pPtrhNext; pPtrhNext = pPtrhNext-pNext; if( bDeleteImage ) pPtr-。

53、pSprite-DeleteSprite(); delete pPtr; ; m_pListHeader NULL; m_iListSize 0; CGameSprite.h #include commonclass.h class CGameSprite :public CSprite private: public: CGameSprite(const char *szName); virtualCGameSprite(); /get 方法 ; CGameSprite.cpp #include .HeaderCGameSprite.h CGameSprite:CGameSprite(con。

54、st char* szName):CSprite(szName) CGameSprite:CGameSprite() Main.cpp / #include CommonClass.h #include LessonX.h / / / 主函数入口 / / int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) / 初始化游戏引擎 if( !CSystem:InitGameEngine( hInstance, lpCmdLine ) ) return 0; / 。

55、To do : 在此使用 API 更改窗口标题 CSystem:SetWindowTitle(LessonX); / 引擎主循环,处理屏幕图像刷新等工作 while( CSystem:EngineMainLoop() ) / 获取两次调用之间的时间差,传递给游戏逻辑处理 float fTimeDelta = CSystem:GetTimeDelta(); / 执行游戏主循环 g_GameMain.GameMainLoop( fTimeDelta ); ; / 关闭游戏引擎 CSystem:ShutdownGameEngine(); return 0; / / / 引擎捕捉鼠标移动消息后,将调用。

56、到本函数 void CSystem:OnMouseMove( const float fMouseX, const float fMouseY ) / 可以在此添加游戏需要的响应函数 g_GameMain.OnMouseMove( fMouseX, fMouseY ); /= / / 引擎捕捉鼠标点击消息后,将调用到本函数 void CSystem:OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY ) / 可以在此添加游戏需要的响应函数 g_GameMain.OnMouseClick( iM。

57、ouseType, fMouseX, fMouseY ); /= / / 引擎捕捉键盘按下消息后,将调用到本函数 / bAltPress bShiftPress bCtrlPress分 别为判断 Shift,Alt ,Ctrl 当前是 否也处于按下状态。比如可以判断 Ctrl+E 组合键 void CSystem:OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress ) / 可以在此添加游戏需要的响应函数 g_GameMain.OnKeyDown( iKey,。

58、 bAltPress, bShiftPress, bCtrlPress ); /= / / 引擎捕捉键盘弹起消息后,将调用到本函数 void CSystem:OnKeyUp( const int iKey ) / 可以在此添加游戏需要的响应函数 g_GameMain.OnKeyUp( iKey ); /= / / 引擎捕捉到精灵与精灵碰撞之后,调用此函数 void CSystem:OnSpriteColSprite( const char *szSrcName, const char *szTarName ) g_GameMain.OnSpriteColSprite(szSrcName, szTarName ); /= / / 引擎捕捉到精灵与世界边界碰撞之后,调用此函数 . / iColSide : 0 左边, 1 右边, 2 上边, 3 下边 void CSystem:OnSpriteColWorldLimit( const char *szName, const int iColSide ) g_GameMain.OnSpriteColWorldLimit(szName,iColSide );。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。