我对 iOS 和 Sprite Kit 编程很陌生,想知道如何结合:
-[SKAction runAction:withKey:]
和
-[SKAction runAction:completion:]
一方面,我想阻止节点再次运行相同的动作(或动作序列),另一方面,我想对动作的终止做出反应,但是没有方法,据我所知, 没办法同时使用。
谢谢
我对 iOS 和 Sprite Kit 编程很陌生,想知道如何结合:
-[SKAction runAction:withKey:]
和
-[SKAction runAction:completion:]
一方面,我想阻止节点再次运行相同的动作(或动作序列),另一方面,我想对动作的终止做出反应,但是没有方法,据我所知, 没办法同时使用。
谢谢
像这样使用+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;
这是Daniel L. Alves 创建的Swift 2.x(在下面更新到Swift 3.x )的一个很好的解决方案,使用SKNode
扩展:
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*)
,如果您的操作已经有一个键,您可以检索该操作。
如果使用相同键的操作已在运行,则在添加新操作之前将其删除。