资源:http://download.csdn.net/detail/hezeping888/5722877
上一节完成了
GameLayer:加载鱼儿,并维护游戏主界面的鱼儿可见数量
Fish:负责创建一条鱼, 行为:游动,被捕获,销毁自身
接下来我们让GameLayer调度炮台发射的子弹与游动的鱼儿,让他们产生激情的火花
在GameLayer.app中添加头文件:
#include "Bullet.h"
在GameLayer::init()方法中添加周期检测子弹和碰撞的任务
bool GameLayer::init(){
/*
省略上一节若干代码
*/
//注册任务调度,不断检测子弹与鱼儿的碰撞,注意其调度周期与不断检测游戏主界面的鱼儿数量并保持指定数量 任务周期的区别
this->schedule(schedule_selector(GameLayer::updateGame), 0.05f);
return true;
}
下面看看GameLayer::updateGame方法的实现:
//此函数被updateGame方法调用,缩小被击中鱼儿的检测范围,提高击中的碰撞视觉效果
//由于没有被GameLayer.h中声明,所以必须定义在被被调用之前
//rc:被检击中的鱼儿的空间 xr:相对宽度 xy:相对高度
CCRect shrinkRect(CCRect rc, float xr, float yr)
{
float w = rc.size.width * xr;
float h = rc.size.height * yr;
CCPoint pt = ccp(rc.origin.x + rc.size.width * (1.0f - xr) / 2,
rc.origin.y + rc.size.height * (1.0f - yr) / 2);
return CCRectMake(pt.x, pt.y, w, h);
}
//被周期回调,不断检测子弹与鱼儿的碰撞,并完成相关积分规则计算
void GameLayer::updateGame(cocos2d::CCTime dt){
CCObject *pFishObj = NULL;//鱼儿对象
CCObject *pBulletObj = NULL;//子弹对象
//两层嵌套循环,检测每颗字弹与鱼儿的碰撞
CCARRAY_FOREACH(m_pBullets, pBulletObj)
{
//获取一个发射的子弹
Bullet *pBullet = (Bullet *)pBulletObj;
if(pBullet->getCaught()) //如果子弹已经击中过鱼儿,就不在处理,获取下一枚子弹
continue;
bool caught = false;//假设当前子弹还未击中鱼儿
CCARRAY_FOREACH(m_pFishes, pFishObj)
{
//获取当前正在游动的鱼儿
Fish *pFish = (Fish *)pFishObj;
if(pFish->getCaught())//如果鱼儿已经被击中,就不再被处理,获取下一条鱼儿
continue;
//缩小鱼儿检测范围,此处为简单,设置另外固定宽高比例值,实际中,应该更具不同的鱼儿种类进行相应的比例设置
CCRect hittestRect = shrinkRect(pFish->getSpriteFish()->boundingBox(), 0.8f, 0.5f);
//方形碰撞检测,检测当前子弹是否击中鱼儿
if(hittestRect.containsPoint(pBullet->getSpriteBullet()->getPosition()))
{
caught = true;//当前子弹击中鱼儿,覆盖初始值
//被击中的鱼儿播放被击中的表现
pFish->showCaught();
//积分计算 ,下一节实现
//m_nScore += 125;
//m_pRollNumGroup->setValue(m_nScore);
}
}
if(caught)
{
//子弹击中鱼儿,在击中的位置 撒网 捞鱼
pBullet->showNet();
}
}
}
好的 ,到此完成了第四节的内容,效果:子弹击中满屏的鱼儿。
图片被删除