0

iOS 14、スイフト 5.x

SKEffect を使用して spriteNode にグラデーションを追加しようとしています。コードはコンパイルされますが、クラッシュします。ここで不可能なことを試みているのでしょうか。

    let image2U = UIImage(named: "2140983")?.ciImage
    
    let effectsNode = SKEffectNode()
    let filter = CIFilter(name: "CILinearGradient")
    
    let startColor = UIColor.red
    let endColor = UIColor.yellow
    let startVector = CIVector(cgPoint: CGPoint(x: 0, y: 0))
    let endVector = CIVector(cgPoint: CGPoint(x: box.size.width, y: box.size.height))
    filter?.setDefaults()
    filter?.setValue(startVector, forKey: "inputPoint0")
    filter?.setValue(endVector, forKey: "inputPoint1")
    filter?.setValue(startColor, forKey: "inputColor0")
    filter?.setValue(endColor, forKey: "inputColor1")
    filter?.setValue(image2U, forKey: "inputImage")
    effectsNode.filter = filter
    self.addChild(effectsNode)
    effectsNode.addChild(box)

コンパイルしますが、このメッセージでクラッシュします...

2021-07-09 21:08:47.584142+0200 GameIV[19791:1140737] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<CILinearGradient 0x600002070d20> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key InputImage.'

ご覧のとおり、inputImage を追加しましたか? UIImage を試してみましたが、同じエラーが発生しました...画像をまったく試しませんでしたが、同じエラーが発生しましたか?

4

2 に答える 2

0

私の質問に対する答えは、SKEffectNodes には入力画像が必要だということです。それがここで伝えようとしていることです。また、グラデーションフィルターは画像を必要とせず、画像で機能しません。単に新しい画像を作成します。これはまさにそれを行うための CIFilter コードです。

extension UIImage {

func returnCheckerboard() -> UIImage {
  let context = CIContext(options: nil)
  let checkerFilter = CIFilter.checkerboardGenerator()
  checkerFilter.color0 = .white
  checkerFilter.color1 = .black
  checkerFilter.center = CGPoint(x: 0, y: 0)
  checkerFilter.sharpness = 1
  checkerFilter.width = 8
  guard let outputImage = checkerFilter.outputImage else { return UIImage() }

  if let cgimg = context.createCGImage(outputImage, from: CGRect(x: 0, y: 0, width: 128, height: 128)) {
        let filteredImage = UIImage(cgImage: cgimg)
        return filteredImage
    }
    return UIImage()
 }
}

これはグラデーションを作成しませんが、原理は同じです。チェッカーボードを作成し、入力画像を必要とせず、SKEffectNode で使用できる CIFilter ではありません。

于 2021-07-15T16:54:55.333 に答える