物理世界和物理体
1.设置碰撞代理和物理世界
2.设置精灵的物理体
一、物理世界
第一步要先添加协议
@interface GameScene ()<SKPhysicsContactDelegate>
@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