【发布时间】:2014-08-09 05:25:11
【问题描述】:
我正在尝试使用SpriteKit 为路径上的笔画绘制动画。我已经使用SKActions 实现了一个可行的解决方案,并使用CABasicAnimations 实现了一个单独的实现。 SKAction 解决方案不是很优雅;它会在 SKAction.repeatAction(action:count:) 调用的每次迭代中创建并绘制一条新路径,每条新路径都比前一条更完整。
func start() {
var i:Double = 1.0
let spinAction:SKAction = SKAction.repeatAction(SKAction.sequence([
SKAction.runBlock({
self.drawCirclePercent(i * 0.01)
if (++i > 100.0) {
i = 1.0
}
}),
SKAction.waitForDuration(0.01)
]), count: 100)
runAction(spinAction)
}
func drawCirclePercent(percent:Double) {
UIGraphicsBeginImageContext(self.size)
let ctx:CGContextRef = UIGraphicsGetCurrentContext()
CGContextSaveGState(ctx)
CGContextSetLineWidth(ctx, lineWidth)
CGContextSetRGBStrokeColor(ctx, 1.0, 1.0, 1.0, 1.0)
CGContextAddArc(ctx, CGFloat(self.size.width/2.0), CGFloat(self.size.height/2.0), radius/2.0, CGFloat(M_PI * 1.5), CGFloat(M_PI * (1.5 + 2.0 * percent)), 0)
CGContextStrokePath(ctx)
let textureImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
texture = SKTexture(image: textureImage)
UIGraphicsEndImageContext()
}
虽然上面的代码有效,但它肯定不是漂亮或高效,而且很可能不是 SKActions 的预期用途。 CABasicAnimation 解决方案更加优雅和高效。
let path:CGMutablePathRef = CGPathCreateMutable()
CGPathAddArc(path, nil, 0, 0, 40.0, CGFloat(M_PI_2 * 3.0), CGFloat(M_PI_2 * 7.0), false)
let pathLayer:CAShapeLayer = CAShapeLayer()
pathLayer.frame = CGRectMake(100, 100, 80.0, 80.0)
pathLayer.path = path
pathLayer.strokeColor = SKColor.whiteColor().CGColor
pathLayer.fillColor = nil
pathLayer.lineWidth = 3.0
self.view.layer.addSublayer(pathLayer)
let pathAnimation:CABasicAnimation = CABasicAnimation(keyPath: "strokeEnd")
pathAnimation.duration = 2.0
pathAnimation.fromValue = 0.0
pathAnimation.toValue = 1.0
pathLayer.addAnimation(pathAnimation, forKey: "strokeEndAnimation")
我的问题是,我真的更希望将所有代码包含在 SKSpriteNode 的子类中(如果上述两种解决方案是我唯一的选择,我会选择第一种)。有什么方法可以改进我的SKAction 实现,使其更接近CoreAnimation 实现,而无需包含CoreAnimation?本质上,我想知道 SpriteKit 是否具有我不知道的功能,可以用来改进第一个实现。
【问题讨论】:
-
我会在不从我的手机发帖时进一步研究这个问题,但这里有一个开始的提示:如果你创建一个自定义
SKShader来绘制一个形状节点,你的变量之一可以在着色器中访问的 GLSL 代码是沿路径的弧长。 -
@rickster 啊,有趣。我对 GLSL 不是很熟悉,但我会做一些阅读。
-
有没有人最终编写了自定义 SKShader 来绘制弧线?
-
@BenMorrow 我研究了它,但最终使用了我原始问题中发布的方法。我认为 SKShader 选项会好得多。抱歉,我无法提供更多帮助。
-
@ScottMielcarski 谢谢,我会使用类似的东西
标签: ios swift sprite-kit ios8 skaction