我試圖將CIFilter的子類用於SpriteKit遊戲,如iOS遊戲教程一書中所述。我創建了我的繼承自CIFilter的子類,它具有(CIImage)inputImage屬性並實現了一個返回CIImage的outputImage方法。爲了阻止Xcode抱怨有衝突的Objective-C getter,我必須提供一個@objc覆蓋。SKEffectNode不會在Swift中使用自定義CIFilter
當我創建並將我的子類型過濾器分配給連接到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()方法與超類'CIFilter'中'outputImage'的getter衝突,具有相同的Objective- C選擇器「
我錯過了一些令人難以置信的明顯的東西?
這個工作取代
,謝謝。 – proliic8