我是iOS和Sprite Kit编程的新手,并想知道如何组合:
-[SKAction runAction:withKey:]
和
-[SKAction runAction:completion:]
一方面,我想阻止一个节点再次运行相同的动作(或动作序列),另一方面,我想对一个动作的终止做出反应,但是没有方法,到目前为止正如我所见,无法同时使用两者。
THX
答案 0 :(得分:27)
在+runBlock:
中使用+sequence:
这样的操作:
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;
答案 1 :(得分:15)
对于Daniel L. Alves创建的 Swift 2.x (更新为 Swift 3.x ,以下..),这是一个很好的解决方案,使用{{1 }} extension:
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 )
}
}
}
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
}
}
答案 2 :(得分:1)
如果您想对终止操作做出反应,是的,您需要使用SKAction runAction:(SKAction*) completion ^{ "Your special code here" }
。这将在动作终止时执行您的特殊代码。
当您使用SKAction runAction:(SKAction*) withKey:(NSString*)
时,如果您的操作已有密钥,则可以检索该操作
如果使用相同键的操作已在运行,则在添加新操作之前已删除。