首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKEffectNode不会在Swift中使用自定义CIFilter

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

Stack Overflow用户
提问于 2015-08-28 12:55:13
回答 1查看 560关注 0票数 1

我正在尝试对CIFilter进行子类化,以便在SpriteKit游戏中使用,正如iOS游戏教程所描述的那样。我已经创建了从CIFilter继承的子类,它具有( CIImage ) inputImage属性,并实现了返回CIImage的outputImage方法。我必须提供一个@objc覆盖,以阻止Xcode抱怨一个冲突的目标-C getter。

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

我有相同的自定义过滤器工作良好的目标C,斯威夫特似乎只是给我一些问题!我的代码如下:

GameScene.swift

代码语言:javascript
复制
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

代码语言:javascript
复制
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选择器”。

我是不是错过了一些非常明显的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-28 16:13:29

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

代码语言:javascript
复制
@objc(outputImageCI) 
func outputImage() -> CIImage

有了这个

代码语言:javascript
复制
override var outputImage:CIImage!
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32271583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档