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); 至此,本实验结束。