如何在不超过最大设置大小且不小于最小设置大小的情况下,永久地使SKShapeNode缩放为随机大小?
答案 0 :(得分:0)
执行此操作的一种方法(如果我正确理解了您的问题),将具有TimeInterval
类型的3个属性,该属性跟踪自从上次缩放精灵以来已经经过了多长时间,应该缩放精灵多久一次(将初始化为0.5s)以及缩放操作需要多长时间(默认值与两次缩放之间的时间相同):
var timeOfLastScale: CFTimeInterval = 0.0
var timePerScale: CFTimeInterval = 0.5
var scaleTime = timePerScale
我们将自上一个小数位起的时间初始化为0,因为它尚未发生。我还将timePerScale
用作缩放效果的持续时间,因此,一旦停止缩放,就会开始新的缩放操作,即节点不断缩放。可以在代码中修改这些效果,以达到不同的效果。
我们还需要2个属性,它们定义最大和最小比例尺大小(从0-100%)和整个比例尺范围的计算属性(我们将此属性设为计算属性,以便更改最大或最小比例因子在您的代码中,您不必重新计算scaleRange):
var maxScale; UInt32 = 100
var minScale:UInt32 = 25
var scaleRange: Uint32 {
get {return maxScale - minScale}
}
(我假设节点的缩放比例可为正常大小的25%至100%)
在update:
中调用一个函数,以检查刻度时间间隔是否已过去。如果有,则创建并运行一个新的SKAction来缩放该节点,并自上次缩放后重置为时间。
如果刻度时间还没有过去,则什么也不做:
override func update(_ currentTime: TimeInterval) {
scaleNode(currentTime)
// Rest of update code
}
func scaleNode(_ currentTime: CFTimeInterval) {
timeSinceLastScale = currentTime - timeOfLastScale
if timeSinceLastScale < timePerScale {return}
// Time per scale has passed, so calculate a new scale actiona and re-scale the node...
let scaleFactor = Float(arc4random_uniform(scaleRange)+minScale)/100
let scaleAction = SKAction.scale(to: scaleFactor,duration: scaleTime)
nodeToBeScaled.run(scaleAction)
timeOfLastScoreDecrement = currentTime
}