contactTestBitMask 无法检测到联系人?

contactTestBitMask fails to detect contact?

我正在检测来自球和屏幕两个边缘的接触(左侧和右侧) 为此,我创建了: – 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

我调查了您的 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];

您可能错过了在 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;
    }
    ...
}

这需要完成,因为无法保证 body 是第一个还是第二个。

这与您使用应用程序的方向似乎不同,但它确实有效。

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];

然后对顶部边缘执行相同的操作。

希望对您有所帮助。