为SKSpriteNode的子类加载物理主体

时间:2014-12-21 05:47:58

标签: ios swift sprite-kit skspritenode skphysicsbody

有没有办法将物理主体加载为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的属性。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我遇到了几乎相同的问题。我从Ray Wenderlich教程的代码开始,并从那里开始子类化。好吧,我非常确定该教程在didBeginContact中交换了射弹和怪物。由于他们是同一个班级,而且只是将他们两个都删除了,所以并不重要。

在你的程序(和我的程序)中,这意味着你试图将一个对象强制转换为它不是的东西。

我刚刚在对objectADidCollide的调用中切换了firstBody和secondBody,它解决了我的问题。

查看您的代码,我认为这不是您的问题,但如果您对错误的对象进行类型转换,我不会感到惊讶。