我正在尝试根据命令让 SKNode 移动到屏幕上。我已经设置了以下 SKAction 链,以便 1) 节点向上移动并离开屏幕,然后 2) 节点向下移动到起始位置,然后 3) 开始四处移动。我已经使用以下代码来尝试实现这一点:
SKAction *moveUp = [SKAction moveTo: shipIntroSpot1 duration:3.0];
SKAction *moveDown = [SKAction moveTo:shipSpot1 duration:ship1MovementSpeed];
[self enumerateChildNodesWithName:@"ship1" usingBlock:^(SKNode *node, BOOL *stop) {
NSLog(@"RUNNING MOVE UP");
[node runAction: moveUp];
[node runAction:moveUp completion:^{
NSLog(@"RUNNING MOVE DOWN");
[node setHidden: NO];
[node runAction: moveDown];
}];
[node runAction:moveDown completion:^{
NSLog(@"STARTING MOVEMENT");
}];
但是,SKAction 似乎没有按正确的顺序触发。我使用的代码是这样的,一旦完成一个步骤,下一步就会开始。但是,在下一个 SKAction 开始工作之前,SKAction 似乎没有足够快地移动节点。我的印象是使用完成调用意味着下一个 Action 在前一个 Action 完成之前不会开始?这似乎不是这里的情况。此外,如果我为第 1 步(MOVING UP)留了足够长的持续时间,它将跳过第 2 步(MOVING DOWN)并开始执行第 3 步(STARTING MOVEMENT)。我完全不知道这怎么可能。如果有人能指出我在理解如何正确地将不同的 Action 链接在一起时的错误,我将不胜感激。
(我没有执行 SKAction 序列,因为我必须在中途“取消隐藏”节点。我不认为我可以把它放在一个序列中,除非我也错了。)
最佳答案
您似乎不了解 runAction 是如何执行的。
使用
[node runAction:moveUp completion:^{
NSLog(@"RUNNING MOVE DOWN");
[node setHidden: NO];
[node runAction: moveDown];
}];
不仅会定义要在 Action 结束时完成的完成,还会运行 Action 然后调用完成,因此需要删除第一个 [node runAction:moveUp]。
其次,在一个函数/ block 中进行的两个 runAction 调用将同时调用,因为您调用了 [node runAction: moveUp]、[node runAction:moveUp completion:] 和 [node runAction:moveDown completion:]都在同一个 block 中,它们将同时执行。
这是您要查找的代码:
SKAction *moveUp = [SKAction moveTo: shipIntroSpot1 duration:3.0];
SKAction *moveDown = [SKAction moveTo:shipSpot1 duration:ship1MovementSpeed];
[self enumerateChildNodesWithName:@"ship1" usingBlock:^(SKNode *node, BOOL *stop) {
NSLog(@"RUNNING MOVE UP");
[node runAction:moveUp completion:^{
NSLog(@"RUNNING MOVE DOWN");
[node setHidden: NO];
[node runAction:moveDown completion:^{
NSLog(@"STARTING MOVEMENT");
}];
}];
关于iOS SpriteKit SKAction 完成调用不起作用/产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20987153/