Objective c contactTestBitMask无法检测到联系人?

Objective c contactTestBitMask无法检测到联系人?,objective-c,sprite-kit,collision-detection,skphysicsbody,Objective C,Sprite Kit,Collision Detection,Skphysicsbody,我从一个球和屏幕的两个边缘(左侧和右侧)检测触点 为此,我创建了: –SKSpriteNode*球 –SKNode*左边缘 –SKNode*右边缘 在这里,我正在设置位掩码 static const uint32_t kCCBallCategory = 0x1 << 0; static const uint32_t kCCEdgeCategory = 0x1 << 1; 添加的右边缘完全相同,只是它具有不同的名称,并且位置设置为 rightEdg

我从一个球和屏幕的两个边缘(左侧和右侧)检测触点 为此,我创建了: –SKSpriteNode*球 –SKNode*左边缘 –SKNode*右边缘

在这里,我正在设置位掩码

static const uint32_t kCCBallCategory       = 0x1 << 0;
static const uint32_t kCCEdgeCategory       = 0x1 << 1;
添加的右边缘完全相同,只是它具有不同的名称,并且位置设置为

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上的项目,设置是在GameSecene.m文件中完成的

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

你可能错过了在didBeginContact中进行的一个简单练习:方法,of

-(void)didBeginContact:(skphysiccontact*)联系人{
SKPhysicsBody*第一个Body;
SKPhysicsBody*第二个机构;
if(contact.bodyA.categoryBitMask

之所以需要这样做,是因为无法保证哪一个主体是第一个还是第二个主体。

这与您使用应用程序的方向不同,但它是有效的

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

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


希望这有所帮助。

OP清楚地写道:“……右边缘添加的内容完全相同,只是名称不同,位置设置为……”@ZeMoon我假设OP使用的代码可以在Github链接上找到。如果是这种情况(他的代码中有输入错误),则永远不会设置rightEdge.physicsBody.categoryBitMask。若你们下载并运行这个项目,那个么OP在他的问题中所陈述的内容可以被看到。如果他听从我的回答,他会得到想要的行为。至少他的项目在我这边运行得很好,当球击中右墙时,发射器被添加。@Whirlwind是绝对正确的,看起来我只是两次输入了错误的边名称和设置了leftEdge bitMask类别。。。谢谢你们,下次我会努力让自己看起来更好。是的,我也在考虑,但这似乎不是问题所在。问题是,我只是在设置正确的位掩码时错误地输入了边缘的名称。。。谢谢你的努力。下次我会努力寻找更好的错误
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];
-(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;
    }
    ...
}