SKPhysicsContactDelegate不起作用

时间:2014-01-17 20:21:51

标签: ios collision-detection 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");
}

正如你所看到的,我将船只和能量设置在相同的位置,因此它们将始终发生碰撞。

对于两个类,我在他们的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

我发现 NSLog 永远不会被调用,因此物理碰撞检测永远不会起作用,我从Apple开发人员教程中读到了很多内容,看起来它们看起来都是一样的有,不知道为什么不工作。 我可以看到屏幕上的船只和能量图像相互碰撞

2 个答案:

答案 0 :(得分:4)

self.physicsBody.dynamic = NO;

静态(非动态)主体不会生成联系事件。让它们充满活力。

另外,我看到你将gameScene传递给了Enemy的一个实例。如果Enemy对游戏场景(ivar)有强烈的引用,那么你可能会在这里创建一个保留周期(敌人保留场景,场景保留敌人)。

在Sprite Kit中,您可以简单地使用self.scene来访问场景,如果您在init期间需要场景,请将该代码移动到设置方法中并在将其添加为子项后立即调用[ene setup]设置涉及场景的步骤。

答案 1 :(得分:4)

将physicsBody设置为dynamic = NO不会影响联系人。更可能的情况是您为两个节点设置相同的contactBitMask和categoryBitMask。您应该将船舶设置为具有以下内容:

self.physicsBody.categoryBitMask = shipCategory;
self.physicsBody.collisionBitMask = 0;
self.physicsBody.contactTestBitMask = enermyCategory;

敌人应该具备以下条件:

self.physicsBody.categoryBitMask = enermyCategory;
self.physicsBody.collisionBitMask = 0;
self.physicsBody.contactTestBitMask = shipCategory;

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