为了在子弹触碰到目标时做一些事情,我们必须要设置碰撞回调.

首先在MainScene.h的类接口中添加碰撞协议:

@interface MainScene : CCNode <CCPhysicsCollisionDelegate>

@end

接下来在类初始化中设置碰撞代理:

    _physics.collisionDelegate = self;

然后就可以设置碰撞回调函数了.至于其中的具体规则不是短短几句话能说清楚的,现在只要知道,我们可以根据不同的碰撞类来分别处理碰撞,即可以设置多个碰撞回调函数.

回到SpriteBuilder中分别设置Player和Bullet的碰撞类型为player和bullet:

(NO.00002)iOS游戏精灵战争雏形(十一)-LMLPHP

切换回Xcode,在MainScene.m中添加如下碰撞回调方法:

-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair player:(CCNode *)player
                          bullet:(CCNode *)bullet{
    bullet.visible = NO;
    return YES;
}

代码很简单,在碰撞时将子弹不可见,返回YES表示发生碰撞,否则不发生碰撞行为.按道理说应该将子弹不可见的代码放到碰撞之后,应该放到ccPhysicsCollisionPreSolve回调中,不过这里也不影响实际效果.返回NO和物理对象为传感器的行为差不多,后面遇到传感器对象时再谈.

现在到了让精灵轰击子弹的时候了,我们简单的每隔2秒向地方精灵发射一颗子弹,在didLoadFromCCB方法中添加如下一句:

    [self schedule:@selector(autoShoot:) interval:2];

添加autoShoot方法:

-(void)autoShoot:(CCTime)delta{
    [self shoot:_sprite1 target:_sprite2.position];
}

其实有些童鞋可能会认为发射子弹方法应该成为Player的方法而不是MainScene的方法.这样说是有道理的,但是这必须解决子弹在哪里的问题.是放在MainScene中,还是放在每个player中?这个涉及到模式的问题,在这里不展开说了.

编译运行,效果如下:

(NO.00002)iOS游戏精灵战争雏形(十一)-LMLPHP

请暂时无视爆炸的特效,那将是下一篇中的故事 ;)

05-11 11:11