回到Xcode中,在MainScene.h接口中添加碰撞协议:
@interface MainScene : CCNode <CCPhysicsCollisionDelegate>
//...
@end
然后在MainScene.m初始化方法中打开碰撞代理:
_physicWorld = (CCPhysicsNode*)[self getChildByName:@"physicWorld" recursively:YES];
NSAssert(_physicWorld, @"physicWorld must not nil");
_physicWorld.collisionDelegate = self;
因为我们要处理的是子弹和传感器的碰撞,所以需要添加对应的碰撞回调方法:
-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair bullet:(CCNode *)bullet sensor:(CCNode *)sensor{
CCPhysicsBody *phyBullet = bullet.physicsBody;
phyBullet.collisionType = @"null";
[self scheduleBlock:^(CCTimer *timer){
bullet.visible = NO;
bullet.position= ccp(0, 0);
} delay:5];
_score++;
_scoreLabel.string = [NSString stringWithFormat:@"Score:%d",_score];
return NO;
}
首先取得子弹的物理对象,然后将碰撞类型改为@”null”;这是因为可能发生以下这种情况:
子弹先进入篮框接触到感应器,但是可能会碰到篮框内壁从而向上反弹离开传感器,接着就下落碰到传感器,造成一颗子弹进入篮框多次计分.
将其碰撞模型设为@”null”之后,该已经碰到传感器的子弹,不再会与传感器发生碰撞了.当然这只是一种解决办法.
接下来我们等到5秒之后,将该子弹设为不可见,并将其从篮框中移出,一来不影响其它射入的子弹,二来可以重用该子弹.
最后计分,并且更新Hud层中的分数标签.
编译运行游戏,最后效果如下:
其中略去了制作Hud层的步骤,经过前几篇的锻炼这个应该不再话下了.
这个游戏到这里就暂时告一段落了,接下来的游戏NO.00004将开发一个类似于弹球打砖块的游戏,到时候见 ;)