Spritekit SKShapeNode随机缩放比例,快速

时间:2018-10-15 06:15:10

标签: swift sprite-kit scale skshapenode

如何在不超过最大设置大小且不小于最小设置大小的情况下,永久地使SKShapeNode缩放为随机大小?

1 个答案:

答案 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
}