11 C++课程设计_太空战机 下载本文

AddSprite(pBullet); }

4、在CBullet类中添加IsMyBullet方法,判断子弹是谁发射的。

bool CBullet::IsMyBullet() {

if(m_iType==0) return true; return false; }

修改调用CreateBullet函数的代码:

将MyFighter.cpp中的LoopTick函数中g_GameMain.CreateBullet(GetSpritePositionX(),

GetSpritePositionY() );改为g_GameMain.CreateBullet(0,GetSpritePositionX(), GetSpritePositionY() ); 然后将EnemyFighter.cpp的LoopTick函数中的g_GameMain.CreateBullet(GetSpritePositionX(), GetSpritePositionY());改为g_GameMain.CreateBullet(1,GetSpritePositionX(), GetSpritePositionY());

5、仿照上边创建一个链表类CSpriteList,用来管理精灵。此类不继承CSprite类,但需

要在文件开头声明头文件:

#include\

6、在头文件的下方创建一个精灵结构体SpriteStruct;

structSpriteStruct {

CSprite*pSprite; SpriteStruct*pNext; SpriteStruct*pPrev; };

7、为类添加一个头节点指针和表示链表节点数的私有成员变量。

SpriteStruct *m_pListHeader; int m_iListSize;

同时添加获取m_iListSize值的成员函数: int GetListSize() {return m_iListSize;};

8、为链接类添加增加节点的方法。

// 添加一个Sprite到链表里

SpriteStruct *CSpriteList::AddSprite( CSprite *pSprite ) {

if( NULL == pSprite ) return NULL;

SpriteStruct*pPtr=new SpriteStruct; pPtr->pSprite=pSprite; pPtr->pNext=NULL; pPtr->pPrev=NULL; // 插入链表表尾

if( NULL == m_pListHeader ) m_pListHeader=pPtr; else {

12

上海锐格软件有限公司 SpriteStruct*pTemp=m_pListHeader; while( NULL != pTemp->pNext ) pTemp=pTemp->pNext; pPtr->pPrev=pTemp; pTemp->pNext=pPtr; }

m_iListSize++; return pPtr; }

9、添加根据精灵名称删除其在链接中的节点的方法。其中第二个参数表示是否将其在

游戏中的精灵也删除。

void CSpriteList::DeleteSprite( const char *szName, 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 <->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_pListHeader->pNext; }

// 删除Sprite if( bDeleteImage )

pPtr->pSprite->DeleteSprite(); // 释放内存 delete pPtr; m_iListSize--; return; } }

13

}

10、添加获得链接中某个节点的方法。首先根据索引获得精灵。

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; }

11、同理添添加通过精灵名字获得节点的方法:

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; }

12、在CGameMain类中定义一个链表对象m_SpriteList,并添加AddSprite方法,用于

管理将游戏中的精灵添加到链表中。

void CGameMain::AddSprite( CSprite *pSprite ) {

m_SpriteList.AddSprite( pSprite ); }

13、根据精灵对象删除精灵

void CSpriteList::DeleteSprite( CSprite *pSprite, bool bDeleteImage ) {

SpriteStruct*pPtr=NULL;

for( pPtr=m_pListHeader; NULL != pPtr; pPtr=pPtr->pNext ) {

if( pPtr->pSprite == pSprite ) {

if( NULL != pPtr->pNext ) {

14

上海锐格软件有限公司 pPtr->pNext->pPrev=pPtr->pPrev; }

if( NULL != pPtr->pPrev ) {

pPtr->pPrev->pNext=pPtr->pNext; }

if( pPtr == m_pListHeader ) {

m_pListHeader=m_pListHeader->pNext; }

if( bDeleteImage )

pPtr->pSprite->DeleteSprite(); delete pPtr; m_iListSize--; return; } } }

14、删除所有精灵。

void CSpriteList::DeleteAllSprite( bool bDeleteImage ) {

SpriteStruct*pPtr=NULL;

SpriteStruct*pPtrhNext=m_pListHeader; while( NULL != pPtrhNext ) {

pPtr=pPtrhNext;

pPtrhNext=pPtrhNext->pNext; if( bDeleteImage )

pPtr->pSprite->DeleteSprite(); delete pPtr; };

m_pListHeader=NULL; m_iListSize=0; }

15、在CEnemyFighter类的ClassTick函数中,调用CGameMain类的AddSprite方法将创

建好的敌方战机添加到链表中。

g_GameMain.AddSprite( pSprite );

16、在CGameMain类的GameRun方法中,遍历链接中的每个节点,获得所有敌方战机

的节点,让战机执行LoopTick方法,实现战机发射子弹和上下浮动。

intiListSize=m_SpriteList.GetListSize(); for( int iLoop = 0; iLoop < iListSize; iLoop++ ) {

CGameSprite * pSprite = m_SpriteList.GetSprite(iLoop);

if (pSprite != NULL && (strstr(pSprite->GetName(),\

15