我正在使用SpriteKit来构建一个游戏,并且在碰撞检测方面遇到了一些麻烦。我有2个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;
答案 0 :(得分:1)
您需要为您的节点将physicsBody.dynamic设置为YES。
来自SKPhysicsBody类参考:
动态
一个布尔值,指示物理实体是否 被物理模拟所感动。
默认值为YES。如果值为NO,那么物理体 忽略了适用于它的所有力量和冲动。