SpriteKit / Swift - 如何在两个节点已经联系时检查它们的联系方式

时间:2016-04-26 19:42:01

标签: ios swift sprite-kit nodes contacts

在我的游戏中,当游戏开始时,一些节点已经联系但我找不到如何检测这些联系人。我只能成功检测节点移动时发生的联系,并在游戏过程中使用函数didBeginContact进行联系。

有人知道如何检测这些联系人吗?

如果需要,这是我的didBeginContact:

func didBeginContact(contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody
    var secondBody: SKPhysicsBody
    if contact.bodyA.categoryBitMask == contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB

        contactsList.append([firstBody.node!,secondBody.node!])
    }
}

1 个答案:

答案 0 :(得分:1)

我刚刚尝试从一开始就让两个精灵重叠,并为我检测到接触。这是代码:

import SpriteKit

struct Collider {
    static let SmallSquare     : UInt32 = 1 << 0
    static let BigSquare       : UInt32 = 1 << 1
}

class GameScene: SKScene, SKPhysicsContactDelegate {

    override func didMoveToView(view: SKView) {

        self.physicsWorld.contactDelegate = self

        let smallSquare = SKSpriteNode(color: .orangeColor(), size: CGSize(width: 50, height:50))
        smallSquare.zPosition = 2
        smallSquare.position = CGPoint(x: frame.midX, y: frame.midY)
        smallSquare.physicsBody = SKPhysicsBody(rectangleOfSize: smallSquare.size)
        smallSquare.physicsBody?.affectedByGravity = false
        smallSquare.physicsBody?.categoryBitMask = Collider.SmallSquare
        smallSquare.physicsBody?.contactTestBitMask = Collider.BigSquare
        smallSquare.physicsBody?.collisionBitMask = 0
        addChild(smallSquare)

        let bigSquare = SKSpriteNode(color: .purpleColor(), size: CGSize(width: 200, height: 200))
        bigSquare.zPosition = 1
        bigSquare.position = CGPoint(x: frame.midX, y: frame.midY)
        bigSquare.physicsBody = SKPhysicsBody(rectangleOfSize: bigSquare.size)
        bigSquare.physicsBody?.affectedByGravity = false
        bigSquare.physicsBody?.categoryBitMask = Collider.BigSquare
        bigSquare.physicsBody?.contactTestBitMask = Collider.SmallSquare
        bigSquare.physicsBody?.collisionBitMask = 0
        addChild(bigSquare)

    }

    func didBeginContact(contact: SKPhysicsContact) {

        print("Contact detected")
    }    
}

稍后,为了适当地检测某些身体之间的接触,你应该这样做:

func didBeginContact(contact: SKPhysicsContact) {

        var firstBody, secondBody: SKPhysicsBody

        if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {

            firstBody = contact.bodyA
            secondBody = contact.bodyB
        } else {

            firstBody = contact.bodyB
            secondBody = contact.bodyA
        }


        if ((firstBody.categoryBitMask & Collider.SmallSquare) != 0 &&
            (secondBody.categoryBitMask & Collider.BigSquare != 0)) {

                print ("Contact detected")
        }

    }

但即使没有这个,当游戏第一次启动时,将会打印该消息,因为物理世界会检测到接触。