【发布时间】:2026-02-23 11:35:02
【问题描述】:
我正在尝试使用 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。
我在SKAction.runBlock(spawnObstacle) 上收到错误Missing argument for parameter 'queue' in call。我认为这与类型有关,并且由于某种原因 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]))
}
【问题讨论】:
-
spawnObstacle 是如何声明和实现的?
-
好的,我添加了 spawnObstacle()
标签: ios swift ios8 sprite-kit