微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 SpriteKit 的变形虫形状控件

如何解决带有 SpriteKit 的变形虫形状控件

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

    let theta : Double  =  (Double(i) * Double.pi / 180.0) * (36.0 + Double.random(in: -1...1))
    let radius : CGFloat =  CGFloat(100.0 + Double.random(in: 0...20))
    let a = CGFloat(cos(theta)) * radius
    let b = CGFloat(sin(theta)) * radius

这部分工作,但是,然后,我开始使用 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。