我对iOS和Sprite Kit编程还很陌生,想知道如何组合以下内容:
-[SKAction runAction:withKey:]
和
-[SKAction runAction:completion:]
一方面,我希望防止节点再次运行相同的操作(或动作序列),另一方面,我想要在动作终止时做出反应,但是目前好像没有方法可以同时实现这两个目标。
谢谢
我对iOS和Sprite Kit编程还很陌生,想知道如何组合以下内容:
-[SKAction runAction:withKey:]
和
-[SKAction runAction:completion:]
一方面,我希望防止节点再次运行相同的操作(或动作序列),另一方面,我想要在动作终止时做出反应,但是目前好像没有方法可以同时实现这两个目标。
谢谢
使用+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;
这是由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 )
}
}
}
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
}
}
SKAction runAction:(SKAction*) completion ^{ "Your special code here" }
。这将在动作终止时执行你的特殊代码。SKAction runAction:(SKAction*) withKey:(NSString*)
时,如果你的动作已经有一个键,你可以检索该动作。