Я пытаюсь анимировать рисунок штриха на пути, используя 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, — это длина дуги вдоль пути. - person rickster   schedule 09.08.2014