我有一个从A点移动到B的精灵。移动可能导致精灵绕过一个物体,这意味着精灵会从面向西,从北到东。
我将当前面向的方向存储在_facing
中。我使用A *寻路算法来构建NSArray
CGPoints
。然后我将精灵走过点,同时将纹理从静态(静止不动)纹理更改为动画纹理。最终,这将变得更加复杂,因为精灵"转向"从方向到方向,但在我学习Objective-C / SpriteKit时,我试图保持简单。
无论如何,问题是我需要在点击这些点时从西/北/东行走更改动画,但是当我排队SKAction
个对象时,它们当然按顺序运行,这意味着当"西"动画正在播放精灵根本不动。如何将SKAction
与另一个SKAction
序列并行运行?// 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];
&#39}使用块是一种潜在的解决方案吗?
这里是我检查&#34;转&#34;的代码。正在发生在给定的点并做出相应的反应:
for()
之前的代码位于SKAction *sequence = [SKAction sequence:walkActions];
[_sprite runAction:sequence withKey:@"Move_Hero"];
中,我遍历所有点 - 后来我做了类似的事情来实际执行操作:
SKAction:runBlock
更新:对于那些试图做同样事情的人,你可以使用SKAction序列,SKAction组和块(通过SKAction:runBlock
)的组合来获得你的并行和连续的行动。使用{{1}},您可以触发特定&#34;群组&#34;只应在该特定时刻运行但不应阻止连续操作的条目。这是一条非常灵活的路线。
答案 0 :(得分:5)
是SKAction有一个名为group:
[SKAction group:@[SKAction1, SKAction2, SKAction3]];
它的运行方式与序列类似,但组数组中的所有SKAction都在一起运行。
有关详细信息,我建议您阅读docs。