有没有办法将物理主体加载为SKSpriteNode的子类? 我在场景外创建了一个SKSpriteNode的子类。
class specializedNode: SKSpriteNode {
var variable = 0
}
在场景中,我创建了一个创建objectA的函数和物理类别的结构。
struct PhysicsCategory {
static let None : UInt32 = 0
static let All : UInt32 = UInt32.max
static let A : UInt32 = 0b1
static let B : UInt32 = 0b10
}
func spawnObjectA () {
objectA = specializedNode()
objectA.physicsBody = SKPhysicsBody(rectangleOfSize: objectA.size)
objectA.physicsBody?.dynamic = true
objectA.physicsBody?.categoryBitMask = PhysicsCategory.A
objectA.physicsBody?.contactTestBitMask = PhysicsCategory.B
objectA.physicsBody?.collisionBitMask = PhysicsCategory.None
objectA.physicsBody?.usesPreciseCollisionDetection = true
addChild(objectA)
}
然后,当objectA与objectB发生冲突时,我调用了didBeginContact。
func objectADidCollide(objectA:specializedNode, objectB:SKSpriteNode) {
objectB.removeFromParent()
++objectA.variable
}
func didBeginContact(contact: SKPhysicsContact) {
var firstBody: SKPhysicsBody
var 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 & PhysicsCategory.A != 0) && (secondBody.categoryBitMask & PhysicsCategory.B != 0)) {
objectADidCollide(firstBody.node as specializedNode, objectB: secondBody.node as SKSpriteNode)
}
}
但是,当我运行代码并且两个对象发生冲突时,代码会出现断点并弹出调试导航器。
第10行(0x58e0fc:trap)变为绿色并显示:
“线程:1 EXC_BREAKPOINT(代码= EXC_ARM_BREAKPOINT,子代码= 0xdefe)”
libswiftCore.dylib`swift_dynamicCastClassUnconditional:
0x58e0ec: cbz r0, 0x58e0fc ; swift_dynamicCastClassUnconditional + 16
0x58e0ee: ldr r2, [r0]
0x58e0f0: cmp r2, r1
0x58e0f2: it eq
0x58e0f4: bxeq lr
0x58e0f6: ldr r2, [r2, #0x4]
0x58e0f8: cmp r2, #0x0
0x58e0fa: bne 0x58e0f0 ; swift_dynamicCastClassUnconditional + 4
0x58e0fc: trap
0x58e0fe: nop
我不想将objectA加载为SKSpriteNode,因为我想更改我在其子类中创建的objectA的属性。有什么建议吗?
答案 0 :(得分:1)
我遇到了几乎相同的问题。我从Ray Wenderlich教程的代码开始,并从那里开始子类化。好吧,我非常确定该教程在didBeginContact中交换了射弹和怪物。由于他们是同一个班级,而且只是将他们两个都删除了,所以并不重要。
在你的程序(和我的程序)中,这意味着你试图将一个对象强制转换为它不是的东西。
我刚刚在对objectADidCollide的调用中切换了firstBody和secondBody,它解决了我的问题。
查看您的代码,我认为这不是您的问题,但如果您对错误的对象进行类型转换,我不会感到惊讶。