我正在尝试对CIFilter进行子类化,以便在SpriteKit游戏中使用,正如iOS游戏教程所描述的那样。我已经创建了从CIFilter继承的子类,它具有( CIImage ) inputImage属性,并实现了返回CIImage的outputImage方法。我必须提供一个@objc覆盖,以阻止Xcode抱怨一个冲突的目标-C getter。
当我创建子类过滤器并将其分配给附加到SKEffectNode的SKScene时,节点只绘制一个灰色背景。如果我使用内置过滤器,SKEffectNode就能正常工作。就我的代码而言,我的outputImage方法似乎从未被调用过,因为XCode从未在我放置的任何断点上中断。
我有相同的自定义过滤器工作良好的目标C,斯威夫特似乎只是给我一些问题!我的代码如下:
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中得到以下错误:“带有目标-C选择器'outputImage‘的方法outputImage()与来自超类'CIFilter’的'outputImage‘与getter冲突,其目标为C选择器”。
我是不是错过了一些非常明显的东西?
发布于 2015-08-28 16:13:29
outputImage是一个计算属性,而不是一个方法,所以请替换
@objc(outputImageCI)
func outputImage() -> CIImage有了这个
override var outputImage:CIImage!https://stackoverflow.com/questions/32271583
复制相似问题