我在SKSpriteNode中使用碰撞检测时遇到问题

时间:2014-07-20 18:36:19

标签: sprite-kit collision-detection skspritenode

您好我使用碰撞检测时遇到问题。发生的事情是,当射弹(子弹)撞击外星人时会产生粒子火花。麻烦有时我认为这个功能会使射弹和怪物混在一起,所以有时会产生子弹被摧毁的火花。

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

1 个答案:

答案 0 :(得分:0)

在我看来,你没有在-didBeginContact方法中将你收到的身体作为参数进行排序。

每次调用联系人委托时,bodyA对象的bodyBcontact属性不一定包含相同类型的主体。在您的情况下,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