ios - 如何测试 SKNode 子类中的 SK 物理接触?

标签 ios swift sprite-kit physics

我有一个名为 Cell 的 SKNode 子类。我设置了所有物理体,它们正确地碰撞。但是,didBeginContact() 函数位于 GameScene 中,我需要它位于 Cell 中,因为我想调用在单元格中声明的函数改变细胞特性。有没有办法将委托(delegate)设置为 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 保留在原处(或者至少不要将其移至单元格)。您想要的是将节点强制转换为您的类 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()

关于ios - 如何测试 SKNode 子类中的 SK 物理接触?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37914349/

相关文章:

swift - 在 Swift 中使用非可选空数组初始化字典

ios - 无法将 UIImageView 放入 SKScene 的 View 中

ios - 使用 NIB 无法识别 UITableViewCell 中单击的单元格 UITableView

iphone - uitableview 在滚动到顶部时自动更新

ios - 为 UIImagePicker 添加圆形裁剪组件?

swift - 是否可以在 Swift 中以相同的名称存储一个字符串和一个数组?

ios - 奇怪的 Spritekit 碰撞错误取决于 SKSpriteNode 位置

ios - 如何平滑地为具有大纹理序列的 Sprite 制作动画?

ios - NSMutableArray 内的 NSMutableArray Swift

iOS: Three20: TTTableItem Delegate: 如何唯一标识tableItem?