如何在持续时间内为一条线设置动画?
How to animate a line over duration?
我是一名正在开发 iOS 游戏的新程序员,我想编写一条动画线来引导用户将对象从 A 点拖动到 B 点。所以我希望这条线从 (长度 = 0) 在 A 点并将自身动画化(比如长度 = 100 像素)到 B 点。
我正在使用 SKShapeNode,目前 'animate' 它,我真的是通过 "update" 方法用一个变量重新创建每帧的线条,该变量取决于 currentTime 使线条稍长和更长的长度,直到使用以下代码达到所需的长度(注意该线是虚线):
然而,我 运行 遇到了几个性能问题,当我修复这些问题时,会引发更多问题。我需要避免让对象的长度成为从“-(void)update:(CFTimeInterval)currentTime”开始经过的时间的函数。相反,我想要一种可以调用的方法来为这条线设置动画——我正在阅读并觉得这可能可以通过 CoreAnimations 实现(比如这里的 CABasicAnimation Ios drawing lines animated),但我不确定具体如何实现。任何正确方向的帮助或指导将不胜感激 - 谢谢。让我知道是否可以提供任何其他信息或解释!
-(void)drawLine : (CGFloat)ratio
{
CGPoint StartPoint = CGPointMake(0,0)
CGPoint FinishPoint = CGPointMake(100,50);
CGPoint AnimatedPoint = CGPointMake(FinishPoint.x*ratio +StartPoint.x*(1-ratio)+1, FinishPoint.y*ratio+StartPoint.y*(1-ratio)+1);
CGFloat pattern[2];
pattern[0] = self.size.height/30; //length of first pattern
pattern[1] = self.size.height/30; //length of second pattern
UIBezierPath *bezierPath=[UIBezierPath bezierPath];
[bezierPath moveToPoint:StartPoint];
[bezierPath addLineToPoint:AnimatedPoint];
CGPathRef dashed =
CGPathCreateCopyByDashingPath([bezierPath CGPath],
NULL,
0,
pattern,
2);
lineDrawn.path = dashed; //this is of type SKShapeNode
CGPathRelease(dashed);
}
是的,您可以(并且可能应该)使用 Core Animation 而不是尝试循环绘制线条。
你要做的是创建一个 CAShapeLayer。您将从 UIBezierPath 安装 CGPath 作为形状层中的路径,并将形状层添加为视图层次结构中某个视图层的子层。
然后您将创建一个 CABasicAnimation,它将使形状图层的 strokeEnd 属性 从 0(结束 = 开始:未绘制线条)到 1.0(从头到尾完全绘制线条)进行动画处理。
这是一种很常见的技术。您应该能够在 "CAShapeLayer CABasicAnimation strokeEnd" 上进行 google 搜索,并找到或多或少完成您需要做的事情的示例。如果您找不到任何东西,请告诉我,我会为您指明正确的方向。
我是一名正在开发 iOS 游戏的新程序员,我想编写一条动画线来引导用户将对象从 A 点拖动到 B 点。所以我希望这条线从 (长度 = 0) 在 A 点并将自身动画化(比如长度 = 100 像素)到 B 点。
我正在使用 SKShapeNode,目前 'animate' 它,我真的是通过 "update" 方法用一个变量重新创建每帧的线条,该变量取决于 currentTime 使线条稍长和更长的长度,直到使用以下代码达到所需的长度(注意该线是虚线):
然而,我 运行 遇到了几个性能问题,当我修复这些问题时,会引发更多问题。我需要避免让对象的长度成为从“-(void)update:(CFTimeInterval)currentTime”开始经过的时间的函数。相反,我想要一种可以调用的方法来为这条线设置动画——我正在阅读并觉得这可能可以通过 CoreAnimations 实现(比如这里的 CABasicAnimation Ios drawing lines animated),但我不确定具体如何实现。任何正确方向的帮助或指导将不胜感激 - 谢谢。让我知道是否可以提供任何其他信息或解释!
-(void)drawLine : (CGFloat)ratio
{
CGPoint StartPoint = CGPointMake(0,0)
CGPoint FinishPoint = CGPointMake(100,50);
CGPoint AnimatedPoint = CGPointMake(FinishPoint.x*ratio +StartPoint.x*(1-ratio)+1, FinishPoint.y*ratio+StartPoint.y*(1-ratio)+1);
CGFloat pattern[2];
pattern[0] = self.size.height/30; //length of first pattern
pattern[1] = self.size.height/30; //length of second pattern
UIBezierPath *bezierPath=[UIBezierPath bezierPath];
[bezierPath moveToPoint:StartPoint];
[bezierPath addLineToPoint:AnimatedPoint];
CGPathRef dashed =
CGPathCreateCopyByDashingPath([bezierPath CGPath],
NULL,
0,
pattern,
2);
lineDrawn.path = dashed; //this is of type SKShapeNode
CGPathRelease(dashed);
}
是的,您可以(并且可能应该)使用 Core Animation 而不是尝试循环绘制线条。
你要做的是创建一个 CAShapeLayer。您将从 UIBezierPath 安装 CGPath 作为形状层中的路径,并将形状层添加为视图层次结构中某个视图层的子层。
然后您将创建一个 CABasicAnimation,它将使形状图层的 strokeEnd 属性 从 0(结束 = 开始:未绘制线条)到 1.0(从头到尾完全绘制线条)进行动画处理。
这是一种很常见的技术。您应该能够在 "CAShapeLayer CABasicAnimation strokeEnd" 上进行 google 搜索,并找到或多或少完成您需要做的事情的示例。如果您找不到任何东西,请告诉我,我会为您指明正确的方向。