Я пытаюсь создать открытый круг из UIBezierPath и превратить его в SKShapeNode, который позже будет преобразован в SKSpriteNode.
У меня была проблема, когда я не мог понять, как уменьшить спрайт, пока ширина его линии не уменьшилась. Вы можете увидеть решение здесь: Изменить размер спрайта без сжатия содержимого
В итоге я исправил некоторые вещи и создал новый класс для реализации пользовательского SKShapeNode с этой функциональностью:
class ShrinkableShape: SKShapeNode {
let level: Int
let bezierPath: UIBezierPath
let scale: CGFloat
let finalLineWidth: CGFloat
let from: SKSpriteNode
let initialLineWidth = CGFloat(20)
let duration = 0.3
// level would be from 1 to 5 (it is in a for loop)
init(level: Int, from: SKSpriteNode) {
self.level = level
self.from = from
// create the open circle which is (43 * level) + 140
bezierPath = UIBezierPath(arcCenter: CGPoint(x: 0, y: 0), radius: CGFloat(((43 * level) + 140)), startAngle: CGFloat(GLKMathDegreesToRadians(-50)), endAngle: CGFloat(M_PI * 2), clockwise: false)
// calls static function in this class so it is more readable
scale = ShrinkableShape.scaleFrom(level: level) / ShrinkableShape.scaleFrom(level: level + 1)
finalLineWidth = (initialLineWidth / scale)
// inits shape and then sets it up to specific values
super.init()
setup()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setup() {
// set sprite to path, set color, set line width and rotate it
self.path = bezierPath.cgPath
self.strokeColor = UIColor(red:0.98, green:0.99, blue:0.99, alpha:1.00)
self.lineWidth = 20
self.position = from.position
// FOR DEBUG: you will see what this makes in the screenshot
let color = SKShapeNode(rect: self.frame)
color.fillColor = UIColor.red
color.alpha = 0.2
color.position = self.position
self.addChild(color)
}
// Makes the radius from the value given (only 1...5) 183, 226, 269, etc
static func scaleFrom(level: Int) -> CGFloat {
return (CGFloat((level * 43) + 140) * 2.0)
}
}
Если вы посмотрите на снимок экрана, вы заметите, что белый круг немного смещен по сравнению с тем, где он должен быть выровнен (серая полоса и путь белого круга должны быть друг на друге). Это происходит только тогда, когда я вызываю функцию масштабирования, показанную в решении (ссылка выше).
Я думаю, что это из-за того, что вся рама испорчена. Если вы видите, рамка очень неправильная (и эта же проблема была причиной прошлых проблем при преобразовании в текстуру, потому что рамка была не такой, какой должна быть)
Почему это происходит? Как это исправить? Есть ли способ вручную установить правильный кадр для SKShapeNode? Любые другие идеи о том, как я могу это сделать?
--Редактировать-- забыл упомянуть. Красная часть на картинке — это отладка, чтобы увидеть кадр SKShapeNode. Вы можете увидеть, как он создается в функции setup(). Но я включил это, чтобы показать, насколько далеко был кадр.
(level * 43 + 140) / ((level + 1) * 43) + 140
, например, первый круг 183x183, а второй круг 226x226. Масштаб 183/226. Когда вы подключаете sprite.scale(183/226), он будет соответствовать точной длине и ширине, которые мне нужны. Но проблема в том, что это не так. Моя мысль о том, почему это не так, потому что кадр не того размера. Например, он больше 226x226. - person ngngngn   schedule 22.10.2016