我有一个从 A 点移动到 B 点的 Sprite 。移动可能会导致 Sprite 绕着一个物体移动,这意味着 Sprite 将从面向西到北再到东。
我将当前朝向存储在 _facing
中。我使用 A* 寻路算法构建一个 CGPoints
的 NSArray
。然后我让 Sprite 穿过这些点,同时将纹理从静态(静止不动)纹理更改为动画纹理。最终这将变得更加复杂,因为 Sprite 从一个方向“转向”另一个方向,但在我学习 Objective-C/SpriteKit 的同时,我试图保持简单。
无论如何,问题是当这些点被击中时,我需要改变向西/向北/向东行走的动画,但是当我排队 SKAction
对象时,它们当然会按顺序运行,这意味着当“西部”动画正在播放时, Sprite 根本没有移动。我怎样才能让一些 SKAction
与另一个 SKAction
序列并行运行?使用 block 是一种潜在的解决方案吗?
这是我检查给定点是否发生“转弯”并做出相应响应的代码:
// Set direction facing.
if (curCGPoint.x > prevCGPoint.x && [_facing isEqualToString:@"left"]) {
[self setDirectionFacing:@"right"];
// Add action to change direction.
SKAction *changeDir = [SKAction repeatActionForever:[SKAction animateWithTextures:walkRightFrames timePerFrame:0.1f resize:NO restore:YES]];
[walkActions addObject:changeDir];
} else if (curCGPoint.x < prevCGPoint.x && [_facing isEqualToString:@"right"]) {
[self setDirectionFacing:@"left"];
// Add action to change direction.
SKAction *changeDir = [SKAction repeatActionForever:[SKAction animateWithTextures:walkLeftFrames timePerFrame:0.1f resize:NO restore:YES]];
[walkActions addObject:changeDir];
}
// Build SKAction to walk hero to the current point.
SKAction *walkAction = [SKAction moveTo:curCGPoint duration:0.1];
// Add to our array of walk SKAction's.
[walkActions addObject:walkAction];
之前的代码在 for()
中,我在其中遍历了所有点——随后我做了类似这样的事情来实际运行操作:
SKAction *sequence = [SKAction sequence:walkActions];
[_sprite runAction:sequence withKey:@"Move_Hero"];
更新:对于那些试图做同样事情的人,您可以结合使用 SKAction 序列、SKAction 组和 block (通过 SKAction:runBlock
) 让你的平行和连续的行动继续下去。使用 SKAction:runBlock
,您可以从特定“组”条目中触发操作,这些条目只应在特定时刻运行,但不应阻止后续操作。这是一条非常灵活的路线。
最佳答案
是的,SKAction 有一个名为 group:
的方法
[SKAction group:@[SKAction1, SKAction2, SKAction3]];
它的运行很像序列,但组数组中的所有 SKAction 一起运行。
有关更多详细信息,我建议阅读 docs .
关于objective-c - 在 SpriteKit 中,我可以将一些 SKActions 排队并行运行,而另一些则按顺序运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23272803/