2015-08-28 38 views
1

我試圖將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選擇器「

我錯過了一些令人難以置信的明顯的東西?

回答

1

outputImage是計算性能不是方法,所以這個

override var outputImage:CIImage! 
+0

這個工作取代

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

,謝謝。 – proliic8

相關問題