08 C++课程设计_弹弹堂 下载本文

char *szName = NULL;

4) 用for循环,一次发射创建3个炮弹,使用 MakeSpriteName获取名字,名字前

缀为 \用CloneSprite、参数\创建炮弹,创建之后使用SetSpriteLinearVelocityPolar给炮弹设置速度,参数fSpeed为m_fGunStrength、以及加减10,参数fPolar分别为m_fGunRotation-10,m_fGunRotation,m_fGunRotation+10。使用SetSpritePosition给炮弹设置坐标,3个炮弹的坐标都一样。我们要模拟的是真实的炮弹,弹道轨迹是一个抛物线,所以我们需要给炮弹一个向下的力量。添加以下代码:

for( iLoop = 0; iLoop < 3; iLoop++ )

{

szName =

CSystem::MakeSpriteName( \

m_pBump[iLoop]=new CAnimateSprite(szName); m_pBump[iLoop]->CloneSprite(\m_pBump[iLoop]->SetSpritePosition(fPosX, fPosY);

m_pBump[iLoop]->SetSpriteLinearVelocityPolar( fGunStrength, fGunRotation); // 我们要模拟的是真实的炮弹,弹道轨迹是一个抛物线,所以我们需要给炮弹一个向下的力量

}

m_pBump[iLoop]->SetSpriteConstantForceY(m_fBumbForceY); fGunRotation += 10.f; fGunStrength += 10.f;

至此,本实验结束。

实验五 炮弹击中目标

【实验内容】

步骤一、判断炮弹精灵和目标精灵 步骤二、炮弹精灵越出世界边界处理 步骤三、击中目标精灵处理 步骤四、击中其他实体尽量处理

【实验思路】

获取系统检测到某两个精灵碰撞的两个精灵名称的消息参数,然后自定义函数处理,首先判断哪个是炸弹精灵的名称,哪个是被炸的精灵的名称。之后判断被炸精灵是否是目标精灵,是则进行相应处理,如果是石块精灵或者是地面,则播放爆炸效果即可。如果炸弹精灵越出边界,则相应进行处理。

【实验指导】

1、 首先设置精灵的碰撞模式,把炮弹精灵设置为发送碰撞,十块精灵以及三个目标精

灵设置为接受碰撞。

在GameInit函数中添加如下代码:

for(int i=0;i

m_pTarget[i]->SetSpriteCollisionReceive(1);//设置目标精灵为接收碰撞 m_pBump[i]->SetSpriteCollisionSend(1); //设置炮弹精灵为发送碰撞

}

m_pStoneSprite->SetSpriteCollisionReceive(1); //设置石块精灵为接收碰撞 m_pBottomWall->SetSpriteCollisionReceive(1);//设置地面精灵为接收碰撞

2、 进入LesssonX.h中添加我们自定义的精灵碰撞处理函数、处理炸弹精灵和其他精灵

爆炸效果显示的函数以及炸弹精灵越出边界处理的函数声明:

void OnSpriteColSprite( const char szSrcName[], const char szTarName[] ); void OnSpriteColWorldLimit( const char szName[], const int iColSide );

void ProcessBumbHit( const int iHitState, const char *szBumbName, const char *szTargetNamee );

3、 添加爆炸效果精灵的成员变量声明:

CEffect* m_pBumpExplode;

//爆炸效果精灵

4、 进入LessonX.cpp中添加以上成员变量的初始化及函数的定义:

1) 在构造函数中添加如下代码:

m_pBumpExplode

=

new CEffect(\

2) 添加精灵碰撞处理函数的定义:

void CGameMain::OnSpriteColSprite( const char szSrcName[], const char szTarName[] ) { }

3) 添加处理炸弹精灵和其他精灵爆炸效果显示函数的定义:

void CGameMain::ProcessBumbHit( const int iHitState, const char *szBumbName, const char *szTargetName ) { }

4) 添加炸弹精灵越出边界处理函数的定义:

void CGameMain::OnSpriteColWorldLimit( const char szName[], const int iColSide ) { }

5、 首先处理炸弹精灵和其他精灵爆炸效果显示的函数,在ProcessBumbHit中添加如下

代码:

1) 首先需要添加一个自定义查找精灵实体的函数FindSpriteByName。进入

LessonX.h中添加该函数的声明:

CAnimateSprite* FindSpriteByName(const char * szName);

在LessonX.cpp中添加该函数的定义:

CAnimateSprite* CGameMain::FindSpriteByName(const char * szName) {

//如果传入的参数是目标精灵的名称,则返回目标精灵实体 if(strstr(szName,\ { }

//如果传入的参数是炸弹精灵的名称,则返回炸弹精灵实体 if(strstr(szName,\

for(int i=0;i<3;i++)

if(stricmp(szName,m_pTarget[i]->GetName())==0)

return m_pTarget[i];

{ } }

for(int i=0;i<3;i++) { }

if(stricmp(szName,m_pBump[i]->GetName())==0)

return m_pBump[i];

这样每次传进一个精灵的名称,就能根据此函数得到该精灵的实体。 2) 根据传进来的炸弹精灵的名称szBumbName得到该精灵实体,并获取它的坐标。

在ProcessBumbHit中添加如下代码:

CAnimateSprite* tmpBumpSprite;

tmpBumpSprite=FindSpriteByName(szBumbName); float fPosX

float fPosY

= =

tmpBumpSprite->GetSpritePositionX(); tmpBumpSprite->GetSpritePositionY();

3) 碰撞到目标,把目标碰撞次数加1,并且播放对应状态的图片动画:

if( 1 == iHitState ) { }

4) 寻找被打中的目标:遍历m_szTargetName数组,比较字符串szTargetName,找

到对应的目标,将该目标的m_iTargetHit数量加1.如果大于等于3,则将该目标隐藏SetSpriteVisible(0);如果被击中次数为1,则用AnimateSpritePlayAnimation播放动画\,否则播放动画\。 在上面的if判断里面添加如下代码:

int iLoop = 0;

}

if( 1 == iHitState || 2 == iHitState )

}

break;

for( iLoop = 0; iLoop < TARGET_COUNT; iLoop++ ) {

if( stricmp( m_pTarget[iLoop]->GetName(), szTargetName ) == 0 ) {

m_iTargetHit[iLoop]++; if( 1 == m_iTargetHit[iLoop] ) else // 隐藏

if( m_iTargetHit[iLoop] >= 3 )

m_pTarget[iLoop]->SetSpriteVisible(0);

m_pTarget[iLoop]->AnimateSpritePlayAnimation(\ m_pTarget[iLoop]->AnimateSpritePlayAnimation(\

5) 如果碰撞到实体,在碰撞处播放碰撞特效:

{

}

m_pBumpExplode->PlayEffect(fPosX, fPosY, 0.f );

6) 最后删除该炮弹:

tmpBumpSprite->DeleteSprite();

6、 系统检测到两个精灵碰撞之后会得到两个精灵的名称,因此我们要先判断哪个精灵

是炸弹,哪个是被炸的精灵,在OnSpriteColSprite函数中添加如下代码: 1) 只处理游戏进行中的响应:

if( 2 != m_iGameState )

return;

if( strstr( szSrcName, \ { }

else if ( strstr( szTarName, \{ }

2) 因为两个名称中至少有一个是炸弹,所以可以用一个if-else if结构来判断:

3) 如果szSrcName是炸弹,再判断szTarName是不是目标精灵。在

if( strstr( szSrcName, \里面添加如下代码:

if( strstr( szTarName, \

else

ProcessBumbHit( 2, szSrcName, \ProcessBumbHit( 1, szSrcName, szTarName );

4) 如果szTarName是炸弹,再判断szSrcName是不是目标精灵。在else if ( strstr( szTarName, \里面添加如下代码:

if( strstr( szSrcName, \

else

ProcessBumbHit( 2, szTarName, \

ProcessBumbHit( 1, szTarName, szSrcName );

5) 在Main.cpp中OnSpriteColSprite函数;里面添加自定义的处理函数:

g_GameMain.OnSpriteColSprite(szSrcName,szTarName);

7、 如果系统捕捉到精灵与世界边界碰撞之后,则我们需要自定义处理操作,在

OnSpriteColWorldLimit的定义里面添加如下代码:

// 只处理游戏进行中的响应 if( 2 != m_iGameState )

return;

// 是炮弹碰到边界, 开始下次开炮 if( strstr( szName, \ { }

ProcessBumbHit( 0, szName, \

在Main.cpp中OnSpriteColWorldLimit函数里面调用对该事件的自定义处理函数:

g_GameMain.OnSpriteColWorldLimit(szName,iColSide);

至此,本实验结束。