contactTestBitMask无法检测到联系人?

时间:2015-08-13 10:42:36

标签: objective-c sprite-kit collision-detection skphysicsbody

我正在检测来自球和屏幕两个边缘的触点(左右一个) 为此我创建了: - SKSpriteNode *球 - SKNode * leftEdge - SKNode * rightEdge

这里我正在设置位掩码

static const uint32_t kCCBallCategory       = 0x1 << 0;
static const uint32_t kCCEdgeCategory       = 0x1 << 1;

我在这里添加边缘

leftEdge.physicsBody = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointZero toPoint:CGPointMake(0.0, self.size.height)];
leftEdge.position = CGPointZero;
leftEdge.physicsBody.categoryBitMask = kCCEdgeCategory;
[self addChild:leftEdge];

除了名称和位置设置为

之外,右边缘添加完全相同
rightEdge.position = CGPointMake(self.size.width, 0.0);

这里我正在配置和添加球

ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:6.0];
ball.physicsBody.categoryBitMask = kCCBallCategory;
ball.physicsBody.collisionBitMask = kCCEdgeCategory;
ball.physicsBody.contactTestBitMask = kCCEdgeCategory;
[_mainLayer addChild:ball];

稍后在didBeginContact中,我正在检查第一个身体是否是球,第二个身体是边缘并为其添加一些爆炸

SKPhysicsBody *firstBody;
SKPhysicsBody *secondBody;
if (firstBody.categoryBitMask == kCCBallCategory && secondBody.categoryBitMask == kCCEdgeCategory) {
        // Collision between ball and the edge
        [self addExplosion:contact.contactPoint withName:@"BallEdgeBounce"];
    }

奇怪的是 - 当球击中左边缘时 - 代码工作正常并且爆炸效果添加到场景中。 但右边缘也不会这样做。对我来说很惊讶,因为碰撞工作得很好。那么右边缘为什么会这样呢?我该如何解决这个问题?

您可以在github上查看项目,设置在GameScene.m文件中完成https://github.com/Fenkins/Space-Cannon

3 个答案:

答案 0 :(得分:2)

我已经调查了你的Git项目,这种情况正在发生,因为你错误地为rightEdge设置了类别(更确切地说,你根本没有设置它)。你应该这样做:

SKNode *rightEdge = [[SKNode alloc]init];
rightEdge.physicsBody = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointZero toPoint:CGPointMake(0.0, self.size.height)];
rightEdge.position = CGPointMake(self.size.width, 0.0);
// leftEdge.physicsBody.categoryBitMask = kCCEdgeCategory;//Error when copy/pasting ;-)
rightEdge.physicsBody.categoryBitMask = kCCEdgeCategory;
[self addChild:rightEdge];

答案 1 :(得分:0)

您可能错过了assigning the first and second bodies based on their categoryBitMask values的didBeginContact:方法中执行的简单练习。

-(void)didBeginContact:(SKPhysicsContact *)contact {
    SKPhysicsBody *firstBody;
    SKPhysicsBody *secondBody;

    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) {
        firstBody = contact.bodyA;
        secondBody = contact.bodyB;
    } else {
        firstBody = contact.bodyB;
        secondBody = contact.bodyA;
    }
    ...
}

这需要做,因为无法保证哪个机构将成为第一个或第二个。

答案 2 :(得分:0)

这是一个与您的应用程序似乎不同的方向,但它有效。

SKSpriteNode *edgeLeft = [SKSpriteNode spriteNodeWithColor:[SKColor clearColor] size:CGSizeMake(1, self.frame.size.height)]; edgeLeft.physicsBody.collisionBitMask = kCCEdgeCategory; edgeLeft.position = CGPointMake(3, self.frame.size.height / 2); [self addChild:edgeLeft];

然后对上边缘做同样的事情。

希望这会有所帮助。