spritekit使用skaction

时间:2016-01-03 22:09:45

标签: swift2 skaction

我创建了一个简单的动作序列,它将对精灵对象执行一些任务,但我还想在序列中进行一个自定义动作,以特定的时间间隔间隔打印一定数量的秒数(例如,以1秒的间隔打印" hello world" 10秒钟)。我尝试创建一个返回skaction的方法,但是没有用,并且当第一次调用序列而不是前一个操作完成后,操作就会运行。这是我到目前为止所得到的

let printAction = SKAction.customActionWithDuration(10) { (SKNode, CGFloat) -> Void in
        NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("printit"), userInfo: nil, repeats: false)
    }
    sprite.runAction(SKAction.repeatActionForever(SKAction.sequence([printAction,scale,printAction])))
    func printit() {
        print("hello world")
    } 

1 个答案:

答案 0 :(得分:0)

您正在组合两种方法,可以单独解决您的问题,但您正在进行的组合将无法正常工作。 (您将从一个动作中触发多个1秒计时器,该动作将以无法控制的速度将您的捕获块调用不可预测的次数。)

使用SKAction的解决方案:

let printMessage = SKAction.runBlock(){ self.printIt() }
let wait         = SKAction.waitwaitForDuration(1)
let printCycle   = SKAction.sequence([printMessage, wait])
self.runAction(SKAction.repeatAction(printCycle, count:10))

func printIt()
{
   print("hello world")
}

使用NSTimer的解决方案:

for time in 0..<10
{
  NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(Double(time)),
          target: self, selector: Selector("printIt:"), 
        userInfo: nil,   repeats: false)
}

func printIt(_ : NSTimer) 
{
   print("hello world")
}

在Sprite Kit环境中,我建议您不要混合使用框架并使用SKAction方法。通过将所有内容链接到您的SKScene和/或SKView,可以更轻松地控制/清理游戏环境