Swift 带有SpriteKit的变形虫形控件

Swift 带有SpriteKit的变形虫形控件,swift,sprite-kit,uibezierpath,Swift,Sprite Kit,Uibezierpath,我是SpriteKit的新手,我正在尝试创建一个扭曲的圆圈,就像“变形虫”一样。我想做的是使用SKShapeNode初始化,在一个圆上创建超过8-10个点的UIBezierPath,具有一定的随机性(类似于): 这一部分是可行的,但随后,我开始使用addCurve()方法构建路径,而形状变得非常难看——可能是因为我不完全理解该方法的工作原理以及我应该使用什么作为控制点 如果您有任何更好的想法或帮助我更好地使用addCurve(),我们将不胜感激。以下是我所做的工作-发布可能对某人有用的内容,可以

我是SpriteKit的新手,我正在尝试创建一个扭曲的圆圈,就像“变形虫”一样。我想做的是使用SKShapeNode初始化,在一个圆上创建超过8-10个点的UIBezierPath,具有一定的随机性(类似于):

这一部分是可行的,但随后,我开始使用addCurve()方法构建路径,而形状变得非常难看——可能是因为我不完全理解该方法的工作原理以及我应该使用什么作为控制点


如果您有任何更好的想法或帮助我更好地使用addCurve(),我们将不胜感激。

以下是我所做的工作-发布可能对某人有用的内容,可以根据您的喜好调整参数

    let path = UIBezierPath()
    let numPoints = Int.random(in: 5...25)
    let totalPoints = numPoints * 3
    var pt : [CGPoint] = Array(repeating: CGPoint(), count: totalPoints)
    var coef = 1.0
    for i : Int in 0..<(totalPoints) {
        let theta  =  (Double(i) * Double.pi / 180.0) * (360.0/Double(totalPoints) + Double.random(in: -1.0...1.0))
        
        coef = (i % 3 == 2 ? 1 : 0.25)
        let radius =  CGFloat(100.0 * coef + Double.random(in: 0...20))
        let a = CGFloat(cos(theta)) * radius
        let b = CGFloat(sin(theta)) * radius
        
        pt[i] = CGPoint(x: a, y: b)
        // the code snippet below is to show the curve and critical points
        let point : SKShapeNode = SKShapeNode(circleOfRadius: 5)
        point.fillColor = i % 3 == 0 ? .green : .cyan
        point.position = pt[i]
        point.zPosition = 10
        self.addChild(point)
        // end of code snippet
    }
    path.move(to: CGPoint(x: self.view!.bounds.minX + pt[0].x, y: self.view!.bounds.minY + pt[0].y))
    for i in 1...numPoints{
        path.addCurve(to: pt[(i * 3) % (totalPoints)],
                      controlPoint1: pt[(i * 3 - 1)],
                      controlPoint2: pt[(i * 3 - 2)])
    }
    path.close()
    let amoeba = SKShapeNode(path: path.cgPath)
    amoeba.strokeColor = .orange
    self.addChild(amoeba)
let path=UIBezierPath()
设numPoints=Int.random(in:5…25)
设totalPoints=numPoints*3
var pt:[CGPoint]=数组(重复:CGPoint(),计数:totalPoints)
var系数=1.0
对于0中的i:Int。。
    let path = UIBezierPath()
    let numPoints = Int.random(in: 5...25)
    let totalPoints = numPoints * 3
    var pt : [CGPoint] = Array(repeating: CGPoint(), count: totalPoints)
    var coef = 1.0
    for i : Int in 0..<(totalPoints) {
        let theta  =  (Double(i) * Double.pi / 180.0) * (360.0/Double(totalPoints) + Double.random(in: -1.0...1.0))
        
        coef = (i % 3 == 2 ? 1 : 0.25)
        let radius =  CGFloat(100.0 * coef + Double.random(in: 0...20))
        let a = CGFloat(cos(theta)) * radius
        let b = CGFloat(sin(theta)) * radius
        
        pt[i] = CGPoint(x: a, y: b)
        // the code snippet below is to show the curve and critical points
        let point : SKShapeNode = SKShapeNode(circleOfRadius: 5)
        point.fillColor = i % 3 == 0 ? .green : .cyan
        point.position = pt[i]
        point.zPosition = 10
        self.addChild(point)
        // end of code snippet
    }
    path.move(to: CGPoint(x: self.view!.bounds.minX + pt[0].x, y: self.view!.bounds.minY + pt[0].y))
    for i in 1...numPoints{
        path.addCurve(to: pt[(i * 3) % (totalPoints)],
                      controlPoint1: pt[(i * 3 - 1)],
                      controlPoint2: pt[(i * 3 - 2)])
    }
    path.close()
    let amoeba = SKShapeNode(path: path.cgPath)
    amoeba.strokeColor = .orange
    self.addChild(amoeba)