【问题标题】:Loading Physics Body for Subclasses of SKSpriteNode为 SKSpriteNode 的子类加载物理体
【发布时间】:2014-12-21 05:47:58
【问题描述】:

有没有办法将物理体加载为 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:陷阱)变为绿色并显示:

“线程: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 的属性。有什么建议吗?

【问题讨论】:

  • 调试导航器?您的意思是应用程序遇到断点或崩溃?如果是这样,请发布崩溃消息以及发生崩溃的行。请注意,spawnObjectA 方法永远不会将节点添加为子节点,因此它永远不会出现在游戏中。
  • 我一定是在转移代码时不小心删除了 spawn 行并删除了不相关的代码。有崩溃消息。
  • 您的项目中有断点吗?检查 xcode 中的断点导航窗格
  • 不,项目中没有任何断点。

标签: ios swift sprite-kit skspritenode skphysicsbody


【解决方案1】:

我遇到了几乎相同的问题。我从 Ray Wenderlich 教程中的代码开始,并从那里开始子类化。好吧,我很确定本教程在 didBeginContact 中交换了射弹和怪物。由于它们是同一个类,并且只是将它们都删除了,所以没关系。

在您的程序(和我的程序)中,这意味着您正在尝试将对象类型转换为不是的对象。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多