我有以下代码:
在我的场景中:
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开发人员教程中读到了很多内容,看起来它们看起来都是一样的有,不知道为什么不工作。 我可以看到屏幕上的船只和能量图像相互碰撞。
答案 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;
底线:它们应该在船上交换。