m_pAim_nor->CloneSprite(\m_vWeapon.push_back(m_pAim_nor); m_pAim_nor->SetSpriteCollisionReceive(true); m_pAim_nor->SetSpritePosition(0.f,20.f);
6、在CTankPlayer类中添加我方坦克与其他精灵碰撞的处理函数,使我方坦克碰到子弹后,
血量设为0,碰到墙后,设置速度为0:
void CTankPlayer::OnSpriteColSprite(CWeapon* pSprite) {
if(pSprite == NULL) {
return; }
else if(strstr(pSprite->GetName(),\{
SetHp(0); }
else if(strstr(pSprite->GetName(),\{
SetSpeedX(0); SetSpeedY(0);
SetSpriteLinearVelocity(GetSpeedX(),GetSpeedY()); } }
7、在CBullet类中添加子弹与其他精灵碰撞后的判断代码,判断子弹与其他精灵碰撞发生的
反应,当我方子弹与军营发生碰撞,地方坦克发射的子弹与敌方坦克发送碰撞时,只设置子弹血量为0,其他不做处理。其他情况,设置被碰撞精灵血量为0:
void CBullet::OnSpriteColSprite(CWeapon* pSprite) {
if(pSprite == NULL) {
return; } SetHp(0);
if(GetOwner() == 1 && strstr(pSprite->GetName(),\ //我方坦克子弹与军营发生碰撞 {
return; }
if(GetOwner() == 0 && strstr(pSprite->GetName(),\敌方坦克子弹打中地方坦克 {
return; }
pSprite->SetHp(0);
24
上海锐格软件有限公司 } 8、在CTankEnemy类中添加地方坦克与其他精灵碰撞的处理函数,设置速度为0,并设置转
换方向的时间m_fChangeDirTime为1.8,在CGameMain类GameRun函数中,当
m_fChangeDirTime>2时,敌方坦克转向。所以在0.2秒之后,这个坦克会自动转向。
void CTankEnemy::OnSpriteColSprite(CWeapon* pSprite)
{
if(pSprite == NULL) {
return; }
SetSpriteLinearVelocity(0.f,0.f); m_fChangeDirTime = 1.8; }
9、在CGameMain中添加事件函数OnSpriteColSprite,表示精灵与精灵碰撞事件。
然后OnSpriteColSprite中添加碰撞检测。进行的检测顺序是,首先判断发送碰撞方为谁,然后调用发送碰撞对象的碰撞处理函数,代码如下:
voidCGameMain::OnSpriteColSprite(const char *szSrcName, const char *szTarName) {
CWeapon* tarSprite = FindWeaponByName(szTarName); if(strstr(szSrcName,\发送碰撞为子弹 {
CBullet *tmpBullet = (CBullet*)FindWeaponByName(szSrcName); tmpBullet->OnSpriteColSprite(tarSprite); }
else if(strcmp(szSrcName,\发送碰撞为我方坦克 {
m_pTankPlayer->OnSpriteColSprite(tarSprite); }
else if(strstr(szSrcName,\发送碰撞为敌方坦克 {
CTankEnemy* tmpEnemy = (CTankEnemy*)FindWeaponByName(szSrcName); tmpEnemy->OnSpriteColSprite(tarSprite); } }
实验八 显示游戏信息
【实验内容】
1、显示游戏的得分等信息。
2、完善游戏,使游戏能够循环运行。
3、记录游戏的分数,当分数高于上次的得分时,将此次得分写入文件。
【实验运行结果】
25
【实验思路】
在OnSpriteColSprite碰撞检测中,每消灭一辆地方坦克加1分,同时敌方坦克数量减1。
完善CGameMain中的GameInit,GameEnd等,使程序能够循环运行。
在CGameMain类的GameInit方法中,读取游戏的最高分。在游戏结束GameEnd方法中,记录游戏的最高分。
【实验指导】
1、在CGameMain中添加以下成员变量:
CTextSprite* m_pScore; //表示分数的文本精灵 CTextSprite* m_pHight; //表示最高分的文本精灵 CTextSprite* m_pEnemy;//表示敌人数量的文本精灵 int m_iScore;//分数 int m_iEnemy;//敌人数量 int m_iHight;//几局最高分
float m_fDeltaTime;//表示游戏时间
在构造函数中创建这三个文本精灵对象并初始化变量: m_pScore = new CTextSprite(\m_pHight = new CTextSprite(\m_pEnemy = new CTextSprite(\ m_iScore=0;//分数 im_iEnemy=0;//敌人数量 m_iHight = 0; m_fDeltaTime = 0.f;
2、在AddTankEnemy()中的if(m_fTankEnemyTime > 5)判断里添加代码使坦克数量增长。
m_iEnemy++;
26
上海锐格软件有限公司
3、在OnSpriteColSprite函数中,在判断发送碰撞为子弹的if(strstr(szSrcName,\
下添加代码:
if( tmpBullet->GetOwner()==1 && strstr(szTarName,\{
m_iScore++; m_iEnemy--; }
4、在GameInit方法初始化变量,并打开记录文件,如果文件不存在则创建该文件,如果存
在,则读取数据。并显示在游戏中。
m_iBulletNum = 0; m_iTankEnemyNumber = 0; m_fTankEnemyTime = 4.f; m_iScore = 0; m_iHight = 0; m_iEnemy = 0; m_fDeltaTime = 0.f;
FILE * fp =fopen(\if(fp) {
fread(&m_iHight,sizeof(int),1,fp); fclose(fp); }
m_pHight = new CTextSprite(\m_pHight->SetTextValue(m_iHight);
5、表示游戏时间的成员变量m_fDeltaTime在GameRun自增:
m_fDeltaTime += fDeltaTime;
6、实时显示游戏数据,在GameRun函数中添加代码:
m_pScore->SetTextValue(m_iScore); m_pHight->SetTextValue(m_iHight); m_pEnemy->SetTextValue(m_iEnemy);
7、设置在我方坦克死亡,我方军营死亡,或者游戏时间>30秒的条件下,游戏结束。更改CGameMain类GameMainLoop函数中case2的判断条件: 将if(true)改为
if(!m_pTankPlayer->IsDead() && !m_pAim_nor->IsDead() && m_fDeltaTime<30)
8、创建删除所有精灵的函数DeleteAllSprite():
voidCGameMain::DeleteAllSprite() {
int n=m_vWeapon.size(); while(m_vWeapon.size()!=0) {
vector
27