我正在尝试使用SKAction.repeatActionForever
来运行由SKAction
组成的序列以及重复之间的随机延迟。
override func didMoveToView(view: SKView) {
let sequence = [
SKAction.runBlock(spawnObstacle), //Missing argument for parameter 'queue' in call
SKAction.waitForDuration(self.random(min: player.speed, max: player.speed * 2 as CGFloat))
]
runAction(SKAction.repeatActionForever(SKAction.sequence(sequence)))
}
func random() -> CGFloat{
return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}
func random(#min:CGFloat, max:CGFloat) -> CGFloat {
return random() * (max - min) + min
}
spawnObstacle
是一个函数,没有返回void的参数,player.speed
是CGFloat
。
我在Missing argument for parameter 'queue' in call
上收到错误SKAction.runBlock(spawnObstacle)
。我认为这与类型有关,而且由于某种原因,runBlock不喜欢spawnObstacle()
,并试图调用
func runBlock(_ block: dispatch_block_t,queue queue: dispatch_queue_t?) -> SKAction
而不是
func runBlock(_ block: dispatch_block_t) -> SKAction
我试着打电话给SKAction.runBlock(spawnObstacle as dispatch_block_t)
看看会发生什么,并且它摆脱了错误,只是为了提出另一个错误:
SKAction.waitForDuration(self.random(min: player.speed, max: player.speed * 2 as CGFloat)) //Extra argument 'min' in call
我认为这个与另一个相似(我不确定我实际上已经解决了,除了伪造编译器)。似乎编译器认为player.speed不是CGFloat所以它转到random()
而不是random(#min:CGFloat, max:CGFloat)
。
我的问题是:据我所知,为什么这两种类型的错误发生了?
编辑:这是spawnObstacle()
func spawnObstacle() -> Void{
let obst = Obstacle(
color: UIColor.redColor(),
size: CGSize(width: 50.0,height: 50.0))
let node = SKSpriteNode(color: obst.color, size: obst.size)
node.position = CGPoint(x: size.width, y: 0 + obst.size.height / 2)
addChild(node)
let duration = player.speed
let actionMove = SKAction.moveTo(CGPoint(x:0 - obst.size.width / 2,y:node.position.y), duration: NSTimeInterval(duration))
let actionMoveDone = SKAction.removeFromParent()
node.runAction(SKAction.sequence([actionMove,actionMoveDone]))
}
答案 0 :(得分:2)
Swift有时会发出与真正问题没有任何关系的错误。在这种情况下,您的问题是SKAction.waitForDuration
需要NSTimeInterval,但您传入的是CGFloat。您需要从CGFloat构造一个NSTimeInterval。
let sequence = [
SKAction.runBlock(spawnObstacle),
SKAction.waitForDuration(NSTimeInterval(random(min: player.speed, max: player.speed * 2)))
]
答案 1 :(得分:-1)
runBlock
期望一个块不是一个方法,你可以定义一个块并从那里调用该方法:
SKAction.runBlock({ () -> Void in self.spawnObstacle()})
或尝试
SKAction.runBlock({self.spawnObstacle()})
编辑:这不是崩溃的原因