我试图使碰撞检测按我需要的方式工作,但无济于事。我要完成的工作是在角色接触到对象时得到通知,但不能阻止它继续移动到对象上。在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物理实体的属性。因此,不会设置categoryBitMaskcollisionBitMaskcontactTestBitMask的值,因为您使用了可选的链接,因此playerWalk.physicsBody?解析为nil而没有任何设置。

然后,当您创建playerWalk物理物体时,它仅具有默认属性,即没有类别,没有接触并与所有物体碰撞,因此它与您的梯子碰撞,因此无法在其上移动。

移动线:

playerWalk.physicsBody = SKPhysicsBody(rectangleOf: playerWalk.frame.size)


到设置物理实体属性的行之前。

08-16 01:17