gpt4 book ai didi

ios - SKEffectNode 不会在 Swift 中使用自定义 CIFilter

转载 作者:行者123 更新时间:2023-11-29 12:14:47 25 4
gpt4 key购买 nike

我正在尝试子类化 CIFilter 以便在 SpriteKit 游戏中使用,如 iOS Games by Tutorials 一书中所述。我创建了继承自 CIFilter 的子类,它有一个 (CIImage) inputImage 属性并实现了一个返回 CIImage 的 outputImage 方法。我必须提供一个 @objc 覆盖以阻止 Xcode 提示 Objective-C getter 冲突。

当我创建子类滤镜并将其分配给附加到 SKScene 的 SKEffectNode 时,该节点仅绘制灰色背景。如果我使用内置过滤器,则 SKEffectNode 工作正常。就我的代码而言,似乎从未调用过我的 outputImage 方法,因为 XCode 永远不会在我放置的任何断点处中断。

我有相同的自定义过滤器,在 Objective-C 中运行良好,Swift 似乎给我带来了一些问题!我的代码如下:

GameScene.swift

import UIKit
import SpriteKit

class StartupScene: SKScene {

override func didMoveToView(view: SKView) {
anchorPoint = CGPointMake(0.5, 0.5)
let effectNode = SKEffectNode()
effectNode.shouldEnableEffects = true
let filter = OldTimeFilter();
effectNode.filter = filter

let backgroundNode = SKSpriteNode(color: UIColor.redColor(), size: frame.size)
effectNode.addChild(backgroundNode)
self.addChild(effectNode);

let labelNode = SKLabelNode(text: "Hello")
labelNode.fontColor = UIColor.blueColor();
backgroundNode.addChild(labelNode)
}
}

OldTimeFilter.swift

import Foundation
import CoreImage

class OldTimeFilter:CIFilter
{
var inputImage: CIImage?


@objc(outputImageCI)
func outputImage() -> CIImage
{
let time = CFAbsoluteTimeGetCurrent();
let first = sin(time / 15.0) * 100.0
let second = sin(time / 2.0) * 25.0

let v1: [Float] = [Float(first), 1.5]
let v2: [Float] = [Float(second), 1.5]

let randVal1 = noise2(UnsafeMutablePointer(v1))
let randVal2 = noise2(UnsafeMutablePointer(v2))

let colorControls = CIFilter(name: "CIColorControls")
colorControls.setValue(0.0, forKey: "InputSaturation")
colorControls.setValue(randVal2 * 0.2, forKey:"inputBrightness")

let vignette = CIFilter(name: "CIVignette")
vignette.setValue(0.2+randVal2, forKey: "inputRadius")
vignette.setValue(randVal2 * 0.2 + 0.8, forKey: "inputIntensity")


var transform = CGAffineTransformMakeTranslation(
CGFloat(0.0), CGFloat(randVal1 * 45.0))

colorControls.setValue(inputImage, forKey: kCIInputImageKey)
vignette.setValue(colorControls.outputImage,
forKey: kCIInputImageKey)
return vignette.outputImage.imageByApplyingTransform(transform)

}
}

如果我从过滤器中删除@objc(outputImageCI),我会从 Xcode 得到这个错误: “带有 Objective-C 选择器‘outputImage’的方法 outputImage() 与来自具有相同 Objective-C 选择器的父类(super class)‘CIFilter’的‘outputImage’的 getter 冲突”

我是否漏掉了一些非常明显的东西?

最佳答案

outputImage 是计算属性而不是方法,所以替换

@objc(outputImageCI) 
func outputImage() -> CIImage

有了这个

override var outputImage:CIImage!

关于ios - SKEffectNode 不会在 Swift 中使用自定义 CIFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32271583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com