gpt4 book ai didi

ios - 为 SKSpriteNode 的子类加载物理体

转载 作者:行者123 更新时间:2023-11-28 07:13:11 24 4
gpt4 key购买 nike

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

最佳答案

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

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

我只是在调用 objectADidCollide 时切换了 firstBody 和 secondBody,它解决了我的问题。

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

关于ios - 为 SKSpriteNode 的子类加载物理体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27587062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com