【发布时间】: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