繁体   English   中英

如何在SKNode子类中测试SK物理接触?

[英]How can I test for a SK physics contact within a SKNode subclass?

我有一个称为Cell的SKNode子类。 我设置了所有物理物体,它们正确碰撞。 但是, didBeginContact()函数在GameScene ,因此我需要将其放在Cell因为我想调用在cell中声明的函数来改变cell属性。 有没有办法将委托设置为SKNode子类? 还是可以解决方法并从GameScene调用Cell中的函数?

设置位掩码:

let cellCategory: UInt32 = 0x1 << 0
let foodCategory: UInt32 = 0x1 << 1
let borderCategory: UInt32 = 0x1 << 2

在Cell内,设置物理主体:

let physicsBody = SKPhysicsBody(circleOfRadius: 5)
self.physicsBody = physicsBody
self.physicsBody!.affectedByGravity = false
self.physicsBody!.allowsRotation = false
self.physicsBody!.categoryBitMask = cellCategory
self.name = "cell"
self.physicsBody!.contactTestBitMask = cellCategory | borderCategory

另请注意:我正在使用Swift 3.0

编辑:下面的答案是正确的。 对所有人的提示:

func didBeginContact(contact: SKPhysicsContact) {
    ...
}

已重命名为

func didBegin(_ contact: SKPhysicsContact) {
    ...
}

从Swift 3.0开始

将您的didBeginContact保持在didBeginContact处(或至少不要将其移至Cell)。 您想要的是将其强制转换为类Cell的节点,其要旨如下:

func didBeginContact(contact: SKPhysicsContact) {
    if let cell = contact.bodyA.node as? Cell {
        cell.someFunctionThatBelongsToThisClass()        
    } else if let cell = contact.bodyB as? Cell {
        cell.someFunctionThatBelongsToThisClass()        
    }
...

上面的内容相当混乱,应该确定要重构,但是它应该可以帮助您上路。

也许更干净:

let cell: Cell? = contactBodyA.node as? Cell ?? contactBodyB.node as? Cell
cell?.someFunction()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM