SpriteKit碰撞检测很容易,利用physicsBody,使用代理进行检测,测试出来的contact.bodyA,contact.bodyB,再利用其Node进行操作。闲话不说,贴代码:
首先,场景初始化必须设置代理:
self.physicsWorld.contactDelegate=self;
然后就是写这个方法:
-(void)didBeginContact:(SKPhysicsContact *)contact;
碰撞检测有两种实现形式,一种就是导弹打怪物模式的,导弹怪物都消失,然后在接触点贴爆炸效果;另一种就是类似保卫萝卜模式,导弹不消失怪物消失。
A.双消失:
-(void)didBeginContact:(SKPhysicsContact *)contact
{ NSLog(@"碰撞检测!");
[contact.bodyA.node removeFromParent];
[contact.bodyB.node removeFromParent];
[self newBombAtX:contact.bodyA.node.position.x Y:contact.bodyA.node.position.y];
//这句是我单独写出来添加导弹的
}
-(void)newBombAtX:(CGFloat)x Y:(CGFloat)y
{
SKEmitterNode *bomb=[NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"bomb" ofType:@"sks"]];
bomb.position = CGPointMake(x, y);
bomb.name=@"myBomb";
//发送粒子到场景。
bomb.targetNode = [self scene];
[self addChild:bomb];
}
B.单消失:
在这里我使用的方法是根据摩擦力判断哪一个是该要消失的,之前两个SpriteNode都要设置好:
SKSpriteNode *rock;
rock.physicsBody.friction = 0.2;
SkSpriteNode *bullet;
bullet.physicsBody.friction=0.0;
-(void)didBeginContact:(SKPhysicsContact *)contact
{ NSLog(@"碰撞检测!");
SKPhysicsBody *firstBody, *secondBody;
if(contact.bodyA.friction<contact.bodyB.friction)
{
firstBody = contact.bodyA;
secondBody = contact.bodyB;
}
else
{
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
[firstBody.node removeFromParent];
[secondBody.node removeFromParent];
[self newBombAtX:contact.bodyA.node.position.x Y:contact.bodyA.node.position.y];
}
这种方法看需要,因为friction(摩擦力)属性对于碰撞几乎没有影响。想让谁消失,自行调整比较方法就可以。