我正在使用SpriteKit构建游戏,但在冲突检测方面遇到了一些麻烦。我有两个子类SKSpriteNode
、Player
和Enemy
。它们都应该检测到彼此之间的碰撞。以下是我如何初始化Player
对象的physicsBody
:
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.size];
self.physicsBody.affectedByGravity = NO;
self.physicsBody.dynamic = NO;
self.physicsBody.usesPreciseCollisionDetection = YES;
self.physicsBody.categoryBitMask = playerCategory;
self.physicsBody.collisionBitMask = enemyCategory;
self.physicsBody.contactTestBitMask = enemyCategory;
以下是我如何初始化Enemy
对象的physicsBody
:
self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.size];
self.physicsBody.affectedByGravity = NO;
self.physicsBody.dynamic = NO;
self.physicsBody.usesPreciseCollisionDetection = NO;
self.physicsBody.categoryBitMask = enemyCategory;
self.physicsBody.collisionBitMask = playerCategory;
self.physicsBody.contactTestBitMask = playerCategory;
我的GameScene
实现了SKPhysicsContactDelegate
协议,并且在它的init:中有这个
self.physicsWorld.gravity = CGVectorMake(0.0, 0.0);
self.physicsWorld.contactDelegate = self;
然而,didBeginContact
方法并没有得到应有的调用。我尝试在场景中创建对象后初始化physicsBodies
,但仍然没有。我做错了什么?
更新1
这是生成bitMasks
的代码,它位于Common.h
文件中,该文件导入到Prefix.pch
文件中。
static const uint32_t enemyCategory = 0x1 <<0;
static const uint32_t playerCategory = 0x1 <<1;
您需要将节点的physicsBody.dynamic设置为YES。
来自SKPhysicsBody类引用:
动态
一个布尔值,指示物理体是否被物理模拟所打动。
默认值为YES。如果值为NO,则物理体忽略所有施加在它身上的力和脉冲。