Sprite kit 相交节点

Sprite kit 相交节点,sprite-kit,skspritenode,Sprite Kit,Skspritenode,我有一个for循环,它将生成一条没有物理体的SKSpriteNodes轨迹 for _ in 1..<25 { drawBlocks() } 我尝试添加一个print语句,如果在两个相交时实际调用该方法,但它们没有。任何线索?您也可以为块创建一个physicsBody,而不将动态属性设置为true(false=静态对象),因此对于每个块: block.physicsBody = SKPhysicsBody.init(edgeLoopFromRect: block.fr

我有一个for循环,它将生成一条没有物理体的SKSpriteNodes轨迹

   for _ in 1..<25 {
       drawBlocks()
}

我尝试添加一个print语句,如果在两个相交时实际调用该方法,但它们没有。任何线索?

您也可以为块创建一个physicsBody,而不将动态属性设置为true(false=静态对象),因此对于每个块:

block.physicsBody = SKPhysicsBody.init(edgeLoopFromRect: block.frame)
block.physicsBody?.mass = 1
block.physicsBody?.affectedByGravity = false
block.physicsBody?.restitution = 1
block.physicsBody?.dynamic = false
block.physicsBody?.usesPreciseCollisionDetection = true
block.physicsBody?.categoryBitMask = CollisionTypes.Block.rawValue
block.physicsBody?.contactTestBitMask = CollisionTypes. PlayerObject.rawValue
关于您的碰撞类型,可以是:

enum CollisionTypes: UInt32 {
    case Block = 1
    case PlayerObject = 2
}

将块添加到您的
playerObject.physicsBody?.contactTestBitMask
中,并直接到
didBeginContact

检查块和播放器之间的接触。物理会使这更容易,但需要更多的处理。使用物理,您可以选择使用didBeginContact()通知您有联系人。请注意,您的播放器对象需要是动态的,而其他对象可以是静态的(dynamic=false)。静态对象不会生成与其他静态对象的碰撞


如果不使用物理,您需要在update()中检查冲突

我实际上是在块体上使用物理体,但我试图避免这种情况。这是我唯一的选择吗?当你必须处理物理环境时,最好的方法是遵循物理规则,否则你可以用SKActions复制你所有的物理环境,所以答案是:是的,你应该使用physicsbody来阻止碰撞,好的,我接受你的答案是正确的。非常感谢。我实际上是在块体上使用物理体,但我试图避免这种情况。这是我唯一的选择吗?您可以使用帧相交,确保两个精灵共享相同的父对象。
enum CollisionTypes: UInt32 {
    case Block = 1
    case PlayerObject = 2
}