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

Sprite kit 我在SKSpriteNode中使用碰撞检测时遇到问题,sprite-kit,collision-detection,skspritenode,Sprite Kit,Collision Detection,Skspritenode,嗨,我在使用碰撞检测时遇到问题。发生的事情是当射弹击中外星人时,产生了粒子火花。问题是,有时我认为这个函数会将投射物和怪物混淆,所以有时它会在子弹被摧毁的地方产生火花 什么决定了哪个精灵击中哪个 有人能提供一些建议吗 - (void)projectile:(SKSpriteNode *)projectile didCollideWithMonster:(SKSpriteNode *)monster { [projectile removeFromParent]; canfir

嗨,我在使用碰撞检测时遇到问题。发生的事情是当射弹击中外星人时,产生了粒子火花。问题是,有时我认为这个函数会将投射物和怪物混淆,所以有时它会在子弹被摧毁的地方产生火花

什么决定了哪个精灵击中哪个

有人能提供一些建议吗

- (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

在我看来,您并没有在-didBeginContact方法中对作为参数接收的实体进行排序

每次调用contact委托时,contact对象的bodyA和bodyB属性不一定包含相同类型的实体。在您的情况下,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来调用-didCollizeWithMonster。在涉及的两个位掩码类别中,值较低的类别为firstBody,值较高的类别为secondBody


请也看一下。

LearnCos2D您编辑了什么?听起来投射物和怪物参数并不总是您“期望”的。在哪里调用该方法?把密码贴出来。您使用的方法没有确定哪个是哪个,而是假设您正在传递正确的对象以匹配参数,对吗?如何调用DidCollizeWithMonster方法?