SKPhysicsContactDelegate 不工作

phi*_*530 2 collision-detection ios sprite-kit skphysicsbody skphysicsworld

我有以下代码:

在我的场景中:

static const uint32_t enermyCategory    =  0x1 << 0;
static const uint32_t fatherCategory    =  0x1 << 1;

self.physicsWorld.contactDelegate = self;

    //init ship
Ship *ship = [Ship getFather];
ship.position = CGPointMake(CGRectGetMaxX(self.frame) - ship.frame.size.width , ship.frame.size.height);
[self addChild: ship];

    //init enermy
    Enermy *ene = [[Enermy alloc] initWithImageNamed:enermyName gameScene:self];
ene.position = ship.position;
[self addChild:ene];

#pragma mark - Physics Delegate Methods
- (void)didBeginContact:(SKPhysicsContact *)contact{
    NSLog(@"contact detected");
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我一开始就将飞船和能量设置在同一位置,因此它们总是会发生碰撞。

对于这两个类,我在其 init 方法中有以下代码:

//setup physics body
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.size];
self.physicsBody.dynamic = NO;
self.physicsBody.categoryBitMask = enermyCategory; #shipCategory for ship
self.physicsBody.collisionBitMask = 0;
self.physicsBody.contactTestBitMask = shipCategory; #enermyCategory for ship
Run Code Online (Sandbox Code Playgroud)

我发现 NSLog永远不会被调用,因此物理碰撞检测永远不会起作用,我从苹果开发人员教程中阅读了很多内容,看起来与他们拥有的内容完全相同,不确定为什么不起作用。我可以看到屏幕上的飞船和能量图像相互碰撞

jos*_*shd 5

将PhysicsBody 设置为dynamic = NO 不会影响接触。更可能的情况是您为两个节点设置相同的 contactBitMask 和 CategoryBitMask。您应该将船舶设置为具有以下功能:

self.physicsBody.categoryBitMask = shipCategory;
self.physicsBody.collisionBitMask = 0;
self.physicsBody.contactTestBitMask = enermyCategory;
Run Code Online (Sandbox Code Playgroud)

敌人应该具备以下条件:

self.physicsBody.categoryBitMask = enermyCategory;
self.physicsBody.collisionBitMask = 0;
self.physicsBody.contactTestBitMask = shipCategory;
Run Code Online (Sandbox Code Playgroud)

底线:它们应该在船上交换。