gpt4 book ai didi

ios - Texture 中的 SKPhysicsBody 在 Spritekit 中碰撞时给出空值

转载 作者:搜寻专家 更新时间:2023-11-01 07:24:36 24 4
gpt4 key购买 nike

我正在创建一个角色跳跃和收集点数(某些对象)的游戏。当您点击角色时,从图集执行一些动画。当它触及点时,分数增加 1。我正在使用 SKTexture 来创建角色的物理 body 。当我的角色触及它崩溃的点并向我显示此错误

fatal error: unexpectedly found nil while unwrapping an Optional value 

//代码

 Cat = SKSpriteNode(imageNamed: "cat");
Cat.size = CGSize(width: 100, height: 100)
Cat.position = CGPoint(x: self.frame.width/2, y: self.frame.height/2)

//physics
Cat.physicsBody = SKPhysicsBody(texture: SKTexture(imageNamed: "cat"), size:CGSizeMake(100, 100))

但如果我从矩形或圆形创建 Physicsbody,它就可以正常工作。也许这与我用来制作角色动画的 map 集有关。

Cat.physicsBody = SKPhysicsBody(circleOfRadius: self.frame.width/2)

当角色接触到蘑菇时,它会崩溃。工作演示: https://github.com/nak1b/demo-game-error

最佳答案

您的代码的问题是 didBeginContact 被多次调用...您可以通过在 中放置一个 print() 语句来检查这一点如果 block 。

如您所知,SKPhysicsBody 对象有一个名为node 的属性。它是一个可选属性。它代表这个 body 连接到的节点。在您的情况下,这是一个蘑菇节点。

所以当 didBeginContact 第一次被调用时,因为你从它的父节点中删除了一个蘑菇节点,bodyA.node 变成了 nil。下次执行 bodyA.node!.removeFromParent() 会产生崩溃,因为正如我所说,bodyA.node 现在为 nil 但您正在使用强制展开来访问可选的基础值。

仅当您 100% 确定基础值不为零时(或者如果您有意在开发阶段触发错误),才使用强制展开。否则使用可选绑定(bind)或可选链接。像这样:

func didBeginContact(contact: SKPhysicsContact) {

var firstBody, secondBody: SKPhysicsBody

//Do this to avoid double checking
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {

firstBody = contact.bodyA
secondBody = contact.bodyB
} else {

firstBody = contact.bodyB
secondBody = contact.bodyA
}

//No need for double-checking now
if ((firstBody.categoryBitMask & PhysicsCategory.Panda) != 0 &&
(secondBody.categoryBitMask & PhysicsCategory.Score != 0)) {

//This will fail gracefully if node property is nil
secondBody.node?.removeFromParent()
}
}

关于ios - Texture 中的 SKPhysicsBody 在 Spritekit 中碰撞时给出空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36970700/

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