您好我使用碰撞检测时遇到问题。发生的事情是,当射弹(子弹)撞击外星人时会产生粒子火花。麻烦有时我认为这个功能会使射弹和怪物混在一起,所以有时会产生子弹被摧毁的火花。
Q值。什么决定哪个精灵命中哪个。
有人可以提供任何建议吗?
- (void)projectile:(SKSpriteNode *)projectile didCollideWithMonster:(SKSpriteNode *)monster
{
[projectile removeFromParent];
canfire = true;
NSString *path = [[NSBundle mainBundle]pathForResource:@"spark" ofType:@"sks"];
SKEmitterNode *spark = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
spark.position = monster.position;
SKAction *pause = [SKAction waitForDuration:1.0];
SKAction *remove = [SKAction removeFromParent];
[spark runAction:[SKAction sequence:@[pause,remove]]];
spark.position = monster.position;
[monster addChild:spark];
[monster removeFromParent];
}
是的,绝对让弹丸和怪物混在一起:
2014-07-20 19:56:35.279 Space Warz[9420:60b] First Body name = bullet
2014-07-20 19:56:35.280 Space Warz[9420:60b] Hit
2014-07-20 19:56:35.281 Space Warz[9420:60b] Monster Name: crystalship
2014-07-20 19:56:40.878 Space Warz[9420:60b] Contact
2014-07-20 19:56:40.879 Space Warz[9420:60b] First Body name = crystalship
2014-07-20 19:56:40.880 Space Warz[9420:60b] Hit
2014-07-20 19:56:40.881 Space Warz[9420:60b] Monster Name: bullet
2014-07-20 19:56:43.845 Space Warz[9420:60b] Contact
2014-07-20 19:56:43.846 Space Warz[9420:60b] First Body name = bullet
2014-07-20 19:56:43.847 Space Warz[9420:60b] Hit
2014-07-20 19:56:43.848 Space Warz[9420:60b] Monster Name: crystalship
2014-07-20 19:56:43.855 Space Warz[9420:60b] Contact
2014-07-20 19:56:43.856 Space Warz[9420:60b] First Body name = bullet
2014-07-20 19:56:43.857 Space Warz[9420:60b] Hit
2014-07-20 19:56:43.858 Space Warz[9420:60b] Monster Name: crystalship
答案 0 :(得分:0)
在我看来,你没有在-didBeginContact方法中将你收到的身体作为参数进行排序。
每次调用联系人委托时,bodyA
对象的bodyB
和contact
属性不一定包含相同类型的主体。在您的情况下,contact.bodyA
以及contact.bodyB
都可以包含投射物或怪物节点。
您可以按如下方式对实体进行排序:
-(void)didBeginContact:(SKPhysicsContact *)contact`
{
NSLog(@"contact detected");
SKPhysicsBody *firstBody;
SKPhysicsBody *secondBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
firstBody = contact.bodyA;
secondBody = contact.bodyB;
}
else
{
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
//Implement relevant code here.
}
在上面的代码中,您可以通过传递firstBody和secondBody来调用-didCollideWithMonster
。在涉及的两个位掩码类别中,具有较低vaue的那个将是firstBody而具有较高值的那个将是secondBody。
请同时查看此answer。