4

私は SpriteKit ゲームを書いていますが、SKView にあるぼやけたビューの問題に直面しました。ゲームが一時停止されたときに右からスライドし、iOS 7 のコントロール センター パネルのように親ビュー (SKView) のコンテンツをぼかす必要があります。望ましい外観は次のとおりです。

ここに画像の説明を入力

私が実際に得るものは次のとおりです。

ここに画像の説明を入力

実際、左側のビューは完全な黒ではありません。スーパービューのハイライトがほとんど不透明なサブビューでわずかに苦労している様子がわかりますが、ぼかしは適用されていません。iOS 8 のバグ/機能ですか、それとも私の間違い/誤解ですか?

これが私の UIVisualEffectView サブクラスのエッセンシャルです:

class OptionsView: UIVisualEffectView {
//...
    init(size: CGSize) {
        buttons = [UIButton]()
        super.init(effect: UIBlurEffect(style: .Dark))
        frame = CGRectMake(-size.width, 0, size.width, size.height)
        addButtons()
        clipsToBounds = true
    }
    func show() {
        UIView.animateWithDuration(0.3, animations: {
            self.frame.origin.x = 0
        })
    }
    func hide() {
        UIView.animateWithDuration(0.3, animations: {
            self.frame.origin.x = -self.frame.size.width
        })
    }

次に GameScene クラスで:

初期化子で:

optionsView = OptionsView(size: CGSizeMake(130, size.height))

didMoveToView(ビュー:SKView)で:

view.addSubview(optionsView)

一時停止ボタンを押したとき:

self.optionsView.show()

PS私はぼかしビューを実装する別の2つの方法を知っていますが、私のアプリはiOS8のみをサポートする予定なので、これが最も簡単だと思いました

  1. スーパービューからぼやけた静止画像をレンダリングします - > clipsToBounds = trueでUIImageViewをOptionsViewに配置します - > optionsViewの位置をアニメーション化しながらUIImageViewの位置をアニメーション化して、ぼかしがスーパービューに対して相対的に静止するようにします

  2. UIView、UIVisualEffectView、UIBlurView を忘れて、SKEffectNode を SKCropNode と一緒に使用します。

4

2 に答える 2

2

わかりました、UIVisualEffectView の代わりに SKEffectNode を使用して目的の効果を得ることができました。これは、同じ問題に直面している誰かのためのコードです

class BlurCropNode: SKCropNode {
    var blurNode: BlurNode
    var size: CGSize
    init(size: CGSize) {
        self.size = size
        blurNode = BlurNode(radius: 10)
        super.init()
        addChild(blurNode)
        let mask = SKSpriteNode (color: UIColor.blackColor(), size: size)
        mask.anchorPoint = CGPoint.zeroPoint
        maskNode = mask
    }
}

class BlurNode: SKEffectNode {
    var sprite: SKSpriteNode
    var texture: SKTexture {
        get { return sprite.texture }
        set {
            sprite.texture = newValue
            let scale = UIScreen.mainScreen().scale
            let textureSize = newValue.size()
            sprite.size = CGSizeMake(textureSize.width/scale, textureSize.height/scale)
        }
    }
    init(radius: CGFloat) {
        sprite = SKSpriteNode()
        super.init()
        sprite.anchorPoint = CGPointMake(0, 0)
        addChild(sprite)
        filter = CIFilter(name: "CIGaussianBlur", withInputParameters: ["inputRadius": radius])
        shouldEnableEffects = true
        shouldRasterize = true
    }
}

結果:

ここに画像の説明を入力

色々問題はあるけど

  1. shouldRasterize プロパティが true に設定されるまで、クロッピングは SKEffectNode では機能しません。画面全体がぼやけてしまいます。そのため、リアルタイム ブラーを適切に実装する方法がまだわかりません。

  2. BlurCropNode のアニメーションは十分に滑らかではありません。テクスチャをキャプチャして effectNode のスプライトの子に設定するため、最初はラグがあります。dispatch_async でさえ役に立ちません。

誰かが問題の少なくとも1つを解決するのを助けることができれば、非常に高く評価されます

于 2014-07-28T16:33:45.460 に答える