Рисование анимации пути в SpriteKit
Я пытаюсь оживить рисунок обводки на пути, используя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 функциональность, о которой я не знаю, которую можно использовать для улучшения первой реализации.