【发布时间】:2017-01-03 20:04:40
【问题描述】:
我正在关注一个关于 IF 语句有问题的 SpriteKit 教程。该行的逻辑如下:如果子弹和小行星相撞,则将它们移除。
if body1.categoryBitMask == PhysicsCategories.bullet && body2.categoryBitMask == PhysicsCategories.asteroid {
// remove bullet and asteroid
}
在尝试确保小行星 (body2.node) 在关闭之前位于可播放区域内时会出现问题。为此,作者添加了以下内容:
body2.node?.position.y < self.size.height
如下制作完整的 IF 语句:
if body1.categoryBitMask == PhysicsCategories.bullet && body2.categoryBitMask == PhysicsCategories.asteroid && body2.node?.position.y < self.size.height {
// remove bullet and asteroid
}
显然,该行适用于 Swift 2,但是 Swift 3 进行了更正,将位置从可选位置更改并强制展开位置。
if body1.categoryBitMask == PhysicsCategories.bullet && body2.categoryBitMask == PhysicsCategories.asteroid && body2.node!.position.y < self.size.height {
// remove bullet and asteroid
}
通过强制展开位置,当三个物体发生碰撞时,应用程序会以“I THINK”的形式崩溃。看着屏幕真的很难分辨。
我正在测试下面的代码,目前还没有遇到任何问题。你们认为下面的修复会起作用吗?我在想的是,如果我确保 body2.node 不是 nil,那么应用程序没有理由崩溃,因为在尝试强制解包时不会遇到 nil。
if body1.categoryBitMask == PhysicsCategories.bullet && body2.categoryBitMask == PhysicsCategories.asteroid {
// If the bullet has hit the asteroid
if body2.node != nil {
if ( body2.node!.position.y < self.size.height ) {
// remove bullet and asteroid
}
}
}
或者,如果你们可以提出另一种方法来编写原始 IF 语句?
谢谢
【问题讨论】:
-
当三个物体同时接触并且其中一个或多个在 didBegin(_contact) 中被移除而没有等待物理引擎处理所有物体时,游戏很可能会崩溃发生的接触。我只是在这里做了一个解释:stackoverflow.com/a/41452239/3402095 在强制展开之前检查 body.node 是否为 nil 将防止崩溃。同样这样,可能会跳过一些 didBegin(_contact) 调用,因此您必须检查这是否对您的游戏有效。
-
要了解
guard的低谷,请查看:stackoverflow.com/a/39263210/2109038 -
要详细了解
if let正在做什么,请看这里:stackoverflow.com/a/36303241/2109038
标签: sprite-kit swift3