SKSpriteNode框架关闭

时间:2016-10-21 22:57:12

标签: ios swift uibezierpath skspritenode skshapenode

我正在尝试从UIBezierPath创建一个空心圆并将其转换为SKShapeNode,稍后将其转换为SKSpriteNode。

我遇到了一个问题,我无法弄清楚如何收缩Sprite而它的线宽没有缩小。你可以在这里看到解决方案: Resize sprite without shrinking contents

我最终修复了一些内容并创建了一个新类来实现具有此功能的自定义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)
}

}

enter image description here 如果您查看屏幕截图,您会注意到白色圆圈与应该对齐的位置相比稍微偏离(灰色条和白色圆圈路径应该在彼此之间)。这只有在我调用解决方案中显示的缩放功能时才会发生(上面链接)。

我认为这是因为框架全部搞砸了。如果你看到,框架非常关闭(同样的问题是转换为纹理时过去问题的原因,因为框架不是那么精确)

为什么会这样?我如何解决它?我有办法手动为SKShapeNode设置正确的帧吗?关于我如何做到这一点的任何其他想法?

- Edit-- 我忘了提。图片中的红色部分是一个调试,用于查看SKShapeNode的帧。您可以在setup()函数中看到它是如何创建的。但我把它包括在内以显示框架的距离。

1 个答案:

答案 0 :(得分:1)

我认为你的问题的部分原因在于你的线条与位图边缘的位置之间的区别,因为你的线条/轮廓宽度是“周围的”。那些台词。

也许最直观的描述,其中红色是系统看到的精灵大小,黄色可能是你正在考虑的。我大大夸大了线宽,以显示我想到的效果/问题。

enter image description here