SKAction完成处理程序;Swift中的用法
我不熟悉斯威夫特和斯皮特基特。很多SpriteKit动作的示例都在Objective C中,我无法在Swift中映射到,也无法开始工作 如果运行一个SKAction,并且在SKAction完成后想要做其他事情,我如何在Swift中正确地实现这一点SKAction完成处理程序;Swift中的用法,swift,sprite-kit,handler,skaction,completion,Swift,Sprite Kit,Handler,Skaction,Completion,我不熟悉斯威夫特和斯皮特基特。很多SpriteKit动作的示例都在Objective C中,我无法在Swift中映射到,也无法开始工作 如果运行一个SKAction,并且在SKAction完成后想要做其他事情,我如何在Swift中正确地实现这一点 spaceMan.runAction(spaceManDeathAnimation, completion: { println("red box has faded out") }) 任何想法都将不胜感激 编辑: 在
spaceMan.runAction(spaceManDeathAnimation, completion: {
println("red box has faded out")
})
任何想法都将不胜感激
编辑:
在此处发现问题:
spaceManDeathAnimation = SKAction.repeatAction(SKAction.animateWithTextures(textures, timePerFrame: 0.15625), count: 1)
另外,sangony发布了一个非常好的链接,解决了
spaceMan.runAction(spaceManDeathAnimation, completion: {() -> Void in
println("death")
})
非常感谢大家对解决方案的贡献 您的“死亡”操作将永远运行,因此不会调用完成代码,这意味着它将永远不会结束 你可以用
+ repeatAction:count:
设置完成前重复次数计数的方法:
spaceManDeathAnimation = SKAction.repeatAction(SKAction.animateWithTextures(textures, timePerFrame: 0.15625), count:5)
在Swift中,您可以使用此扩展:
extension SKNode
{
func runAction( action: SKAction!, withKey: String!, optionalCompletion: dispatch_block_t? )
{
if let completion = optionalCompletion
{
let completionAction = SKAction.runBlock( completion )
let compositeAction = SKAction.sequence([ action, completionAction ])
runAction( compositeAction, withKey: withKey )
}
else
{
runAction( action, withKey: withKey )
}
}
}
例如,用作:
myShip.runAction(move,withKey:"swipeMove",optionalCompletion: {
//Here action is ended..do whatever you want
}
Swift 3:
用法:
myShip.runAction(action: move, withKey:"swipeMove", optionalCompletion: {
//Here action is ended..do whatever you want
}
您需要的是一个SKAction在SKAction序列中运行一个块。spaceManDeathAnimation操作的作用是什么?它是如何定义的?你也可以分享它的代码吗?在页面上搜索“完成”以获得一些好的例子。我需要
SKAction.repeatAction(东西,计数:1)
才能工作!谢谢我为两个非常愚蠢的问题道歉:为什么要用key:String指定
到第一个操作?第二个函数做什么:func actionForKeyIsRunning(key:String)->Bool{return self.action(forKey:key)!=nil?true:false}
@它只需检查一个操作当前是否正在运行。它很有用,例如:如果!sprite.actionForKeyIsRunning(“rotate”){//do rotation)}为了避免旋转覆盖眼睛,当然,如果您想在编写时删除它,也可以使用它。很抱歉,我只看到了您的第一条注释,您的注释的答案是:因为您可以使用键识别操作。
extension SKNode
{
func run(action: SKAction!, withKey: String!, optionalCompletion:((Void) -> Void)?) {
if let completion = optionalCompletion
{
let completionAction = SKAction.run(completion)
let compositeAction = SKAction.sequence([ action, completionAction ])
run(compositeAction, withKey: withKey )
}
else
{
run( action, withKey: withKey )
}
}
func actionForKeyIsRunning(key: String) -> Bool {
return self.action(forKey: key) != nil ? true : false
}
}
myShip.runAction(action: move, withKey:"swipeMove", optionalCompletion: {
//Here action is ended..do whatever you want
}