带旋转的 SKShapeNode fillTexture

问题描述

我无法弄清楚旋转该节点时 fillTextureSKShapeNode 属性是如何工作的。在这个例子中,我围绕中心创建了一个由 4 个旋转叶片组成的风扇。然而,当叶片旋转时,所应用的纹理的强度会发生变化。为什么?我希望渐变纹理应用程序随着旋转保持不变。

func buildBackground() {
        
        let bg = SKShapeNode.init(rect: UIScreen.main.bounds)
        bg.fillColor = .orange
        
        self.addChild(bg) // self == SKScene

        let size = UIScreen.main.bounds.size
        let fan = SKNode.init()
        let H = size.height
        let W = size.width/2
        let blades = 4

        let triangle = CGMutablePath.init()
        triangle.move(to: .zero)
        triangle.addLine(to: CGPoint(-W,H))
        triangle.addLine(to: CGPoint(+W,H))
        triangle.addLine(to: .zero)
        triangle.closeSubpath()
        
        let da = 360.0/CGFloat(blades)
        var r : CGFloat = 0
        
        let texture = SKTexture.init(size: size,color0: .white,color1: .clear,radius0: 0.25,radius1: 1)

        for i in 0..<blades {
            let blade = SKShapeNode.init(path: triangle)
            fan.addChild(blade)
            blade.fillTexture = texture
            blade.linewidth = 0
            blade.fillColor = .black
            blade.zRotation = r.degreesToradians
            r += da
        }

        bg.addChild(fan)
        
        fan.position = bg.frame.center
        
        fan.run(.repeatForever(.rotate(byAngle: -0.1,duration: 0.2)))
        
        fan.alpha = 0.5
    }
public extension SKTexture {

    convenience init(size       : CGSize,color0     : SKColor,color1     : SKColor,radius0    : CGFloat,// 0
                     radius1    : CGFloat) // 1
    {
        let coreImageContext    = CIContext(options: nil)
        let gradientFilter      = CIFilter(name: "CIRadialGradient")!
        let inputCenter         = CIVector.init(x: size.width/2,y: size.height/2)
        let inpuTradius0        = radius0 * size.diagonal/2
        let inpuTradius1        = radius1 * size.diagonal/2
        
        gradientFilter.setDefaults()
        gradientFilter.setValue(inputCenter,forKey: "inputCenter")
        gradientFilter.setValue(inpuTradius0,forKey: "inpuTradius0")
        gradientFilter.setValue(inpuTradius1,forKey: "inpuTradius1")
        gradientFilter.setValue(color0.asCIColor,forKey: "inputColor0")
        gradientFilter.setValue(color1.asCIColor,forKey: "inputColor1")
        
        let coreImage = coreImageContext.createCGImage(gradientFilter.outputimage!,from: .init(size)) //CGRect(x: 0,y: 0,width: size.width,height: size.height))
        
        self.init(cgImage: coreImage!)
    }

}

enter image description here

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)