我试图使碰撞检测按我需要的方式工作,但无济于事。我要完成的工作是在角色接触到对象时得到通知,但不能阻止它继续移动到对象上。在GameScene
中,我设置了如下对象的物理场:
Category Mask: 8
Collision Mask: 0
Field Mask: 0
Contact Mask: 0
我在代码中将角色添加到场景中。我有一个这样的类别结构:
struct PhysicsCategory {
static let None: UInt32 = 0
static let Player: UInt32 = 0b1 // 1
static let Pillar:UInt32 = 0b10// 2
static let Chest:UInt32 = 0b100// 4
static let Ladder:UInt32 = 0b1000
}
角色物理是这样的:
playerWalk.physicsBody?.categoryBitMask=PhysicsCategory.Player
playerWalk.physicsBody?.collisionBitMask=PhysicsCategory.Pillar
playerWalk.physicsBody?.contactTestBitMask=PhysicsCategory.Chest | PhysicsCategory.Ladder
playerWalk.physicsBody = SKPhysicsBody(rectangleOf:
playerWalk.frame.size)
由于某些原因,角色停在梯子上而不是在梯子上移动。我不知道自己在做什么错。
最佳答案
编辑-在实际创建playerWalk.physicsBody
之前,您已经设置了playerWalk物理实体的属性。因此,不会设置categoryBitMask
,collisionBitMask
和contactTestBitMask
的值,因为您使用了可选的链接,因此playerWalk.physicsBody?
解析为nil
而没有任何设置。
然后,当您创建playerWalk
物理物体时,它仅具有默认属性,即没有类别,没有接触并与所有物体碰撞,因此它与您的梯子碰撞,因此无法在其上移动。
移动线:
playerWalk.physicsBody = SKPhysicsBody(rectangleOf: playerWalk.frame.size)
到设置物理实体属性的行之前。