我正在创建一个相对复杂的动画序列。在其中,某个SKSpriteNode
(鲨鱼)进行两次旋转。在动画开始时,它围绕某个锚点 ap1 旋转,然后围绕不同的锚点 ap2 旋转。我应该如何在动画序列的中途更改锚点?
一些初步想法:
我可能会在SKAction
循环中更改update:
s的 之外的定位点。
我可以将多个SKSpriteNode
用于同一个鲨鱼精灵(带有各自的锚点),当我需要更改锚点时切换(隐藏/显示)精灵节点。
答案 0 :(得分:1)
由于更改精灵的锚点会影响渲染的位置,因此您可能需要进行某种调整以防止精灵突然移动到新位置。这是一种方法:
创建更改定位点的操作
SKAction *changeAnchorPoint = [SKAction runBlock:^{
[self updatePosition:sprite withAnchorPoint:CGPointMake(0, 0)];
}];
SKAction *rotate = [SKAction rotateByAngle:2*M_PI duration: 2];
运行动作以旋转,更改定位点,然后旋转
[sprite runAction:[SKAction sequence:@[rotate,changeAnchorPoint,rotate]] completion:^{
// Restore the anchor point
[self updatePosition:sprite withAnchorPoint:CGPointMake(0.5, 0.5)];
}];
此方法调整精灵的位置以补偿定位点变化
- (void) updatePosition:(SKSpriteNode *)node withAnchorPoint:(CGPoint)anchorPoint
{
CGFloat dx = (anchorPoint.x - node.anchorPoint.x) * node.size.width;
CGFloat dy = (anchorPoint.y - node.anchorPoint.y) * node.size.height;
node.position = CGPointMake(node.position.x+dx, node.position.y+dy);
node.anchorPoint = anchorPoint;
}
答案 1 :(得分:0)
正如Julio Montoya所说,最简单的方法就是"翻译"使用方法SKAction
将代码编入[SKAction runBlock:myBlock]
。