打飞机04-碰撞的实现

打飞机04-碰撞的实现_第1张图片
碰撞.gif

物理世界和物理体

1.设置碰撞代理和物理世界
2.设置精灵的物理体

一、物理世界

第一步要先添加协议

@interface GameScene ()

@end

设置物理世界

-(void)didMoveToView:(SKView *)view {
    
    //物理世界(physicsWorld)碰撞代理设置为self
    self.physicsWorld.contactDelegate = self;

    //物理世界(physicsWorld)重力设置为0
    self.physicsWorld.gravity = CGVectorMake(0, 0); //这里也可以不用设置重力为0,而设置精灵比如plane的plane.physicsBody.affectedByGravity = NO 就可以让精灵不受重力影响
    
//后面接上以前写的代码
}

二、精灵

plane(其他代码就不写了)

    //plane的物理体设置
    plane.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:plane.size];

    //下面这行代码是设置plane不受旋力影响,就是不会被撞歪的意思
    //plane.physicsBody.allowsRotation = NO;

    //plane物理体的碰撞标志符为1
    plane.physicsBody.categoryBitMask = 1;

    //plane可以和标志符为2的精灵碰撞
    plane.physicsBody.contactTestBitMask = 2;

bullet

    //同样设置enemy的物理体
    bullet.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:bullet.size];

    //enemy同样不受旋力影响
    //bullet.physicsBody.allowsRotation = NO;

    //enemy物理体的碰撞标志符为3
    bullet.physicsBody.categoryBitMask = 3;

    //enemy可以和标志符为2的精灵碰撞
    bullet.physicsBody.contactTestBitMask = 2;

enemy(这里的 1|3 意思可以理解为 1或者3)

    //同样设置enemy的物理体
    enemy.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:enemy.size];

    //enemy同样不受旋力影响
    //enemy.physicsBody.allowsRotation = NO;

    //enemy物理体的碰撞标志符为1
    enemy.physicsBody.categoryBitMask = 2;

    //enemy可以和标志符为1和3的精灵碰撞
    enemy.physicsBody.contactTestBitMask = 1|3;

三、碰撞方法

-(void)didBeginContact:(SKPhysicsContact *)contact {
    //contact.bodyA.categoryBitMask == 2或者contact.bodyA.categoryBitMask == 3  2、3对应着enemy和bullet

    if (contact.bodyA.categoryBitMask == 2|contact.bodyA.categoryBitMask == 3 && contact.bodyB.categoryBitMask == 3|contact.bodyB.categoryBitMask == 2) {

        //移除碰撞的物理体
        [contact.bodyA.node removeFromParent];

        [contact.bodyB.node removeFromParent];
    }
}

注意事项

1.添加协议
2.物理世界碰撞代理设置为self
3.精灵的物理体
4.categoryBitMask和categoryBitMask
5.2|3 意思可以理解为 2或3
6.文章没有提到dynamic这个属性因为碰撞之后精灵没有其它动作了直接移除,如果像是酷跑那样的落到一个平台上面就必须要设置dynamic为YES,否则两个不受力的精灵移到一起会直接穿过去

7.因为这里的碰撞之后移除精灵所以allowsRotation可以不用设置,下面这两张图是没有设置allowsRotation和allowsRotation = NO

打飞机04-碰撞的实现_第2张图片
没有设置allowsRotation ![allowsRotation = NO](http://upload-images.jianshu.io/upload_images/3245908-d4799c902ef69923.gif?imageMogr2/auto-orient/strip)

你可能感兴趣的:(打飞机04-碰撞的实现)