对球有一种冲动。但是这个球在这种冲动之后继续前进,但是我希望它能够移动一下。所以我正在尝试这里:
var impulse:CGFloat = 0.22 // bal impulse
申请冲动:
bal.physicsBody?.applyImpulse(CGVectorMake(50 * impulse, 50 * impulse))
试图限制运动:
if bal.physicsBody?.velocity.dx > impulse{
bal.physicsBody?.velocity.dx = bal.physicsBody?.velocity.dx - impulse
}
但最后一段代码却出现了这个错误:
Value of optional type CGFloat? not unwrapped, did you mean to use ! or ?
如何解决?
答案 0 :(得分:1)
当使用选项进行处理时,你总是应该使用if let
解包它们,因为如果使用?
并且值为nil,则代码将不会执行,并且你不会知道有零值。
像这样使用:
var impulse:CGFloat = 0.22 // bal impulse
if let body = bal.physicsBody {
body.applyImpulse(CGVectorMake(50 * impulse, 50 * impulse))
if body.velocity.dx > impulse {
body.velocity.dx = body.velocity.dx - impulse
}
}
else
{
// bal.physicsBody is nil !
}
答案 1 :(得分:1)
鉴于你最近问了一个类似的问题,你真的需要花一些时间来理解选项,因为你会不断遇到这些问题。您需要了解哪些选项是什么,以及处理它们的不同技术。尝试阅读this和this开始。
在此特定示例中,您有一个可选的velocity
,因为您通过另一个可选的physicsBody
通过“可选链接”(?.
)访问它。因此,要在其上执行-
之类的操作,您需要使用可选技术。对于带有额外if let
子句的where
来说,这看起来很好:
if let v = bal.physicsBody?.velocity where v.dx > impulse {
bal.physicsBody?.velocity = CGVector(dx: v.dx - impulse, dy: v.dy)
}
注意,可选的链接可以“分配”,这就是bal.physicsBody?.velocity =
有效的原因。
此外,无需使用CGVectorMake
。与Objective-C不同,CGVector
有一个初始值设定项,它采用相同的参数(如上所示)。