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