SKAction如何结合withKey和completion
Posted
技术标签:
【中文标题】SKAction如何结合withKey和completion【英文标题】:SKAction how to combine withKey and completion 【发布时间】:2014-03-17 00:11:50 【问题描述】:我对 ios 和 Sprite Kit 编程很陌生,想知道如何结合:
-[SKAction runAction:withKey:]
和
-[SKAction runAction:completion:]
一方面,我想阻止一个节点再次运行相同的动作(或动作序列),另一方面,我想对一个动作的终止做出反应,但是没有方法,到目前为止如我所见,无法同时使用两者。
谢谢
【问题讨论】:
您可以使用一个动作序列,在其中添加一个 runBlock 动作作为完成块 【参考方案1】:像这样在+sequence:
中使用+runBlock:
操作:
SKAction *yourAction = ...
SKAction *completion = [SKAction runBlock:^
// Your code.
];
SKAction *sequence = [SKAction sequence:@[ yourAction, completion ]];
[node runAction:sequence withKey:yourKey];
如果你多次使用这个,用这样的方法创建SKNode
类别:
- (void)runAction:(SKAction *)action withKey:(NSString *)key completion:(void(^)(void))block;
【讨论】:
【参考方案2】:这是 Daniel L. Alves 使用 SKNode
创建的 Swift 2.x(在下面更新到 Swift 3.x..)的一个很好的解决方案扩展:
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 )
更新到 Swift 3.x
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
【讨论】:
【参考方案3】:如果您想对动作终止做出反应,是的,您需要使用SKAction runAction:(SKAction*) completion ^ "Your special code here"
。这将在操作终止时执行您的特殊代码。
当你使用SKAction runAction:(SKAction*) withKey:(NSString*)
时,如果你的action已经有key,你可以检索action。
如果使用相同键的操作已在运行,则在添加新操作之前将其删除。
【讨论】:
以上是关于SKAction如何结合withKey和completion的主要内容,如果未能解决你的问题,请参考以下文章
在随机时间结合 waitForDuration:withRange 和 runBlock: 在 SKAction 序列中生成节点
如何将异步CompletableFuture与完成的CompletableFuture结合起来?