ios - 在SpriteKit中使用UIInterpolatingMotionEffect?

标签 ios swift sprite-kit parallax uimotioneffect

UIInterpolatingMotionEffect 旨在与 UIView 一起使用,但是否有可能在节点上的 SpriteKit 中使用它?

如果没有,是否有人有想法以另一种方式实现该效果。

提前致谢

最佳答案

在 Sprite Kit 中创建视差效果可以通过以下方式实现:创建一组 SKNode 图层,向图层添加 Sprite ,然后在用户倾斜设备时将每个图层移动不同的量。您可以选择缩放图层以产生深度幻觉。

这是 Swift 中的实现。由于它使用加速度计,因此这只适用于设备(​​不适用于模拟器)。

import SpriteKit
import CoreMotion

class GameScene: SKScene {

    let squareSize = CGFloat(50.0)
    let manager = CMMotionManager()
    let maxDistance = CGFloat(40.0)

    override func didMoveToView(view: SKView) {

        let colors = [SKColor.redColor(), SKColor.greenColor(), SKColor.blueColor()]

        for i in 0..<colors.count {
            let node = createLayer(colors[i], depth: CGFloat(colors.count-i), screenSize: view.frame.size)
            addChild(node)
        }

        var tiltX:CGFloat = 0.0
        var alpha:CGFloat = 0.25

        // Define block to handle accelerometer updates
        if manager.accelerometerAvailable {
            manager.accelerometerUpdateInterval = 0.1
            manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()) {
                [weak self] (data: CMAccelerometerData!, error: NSError!) in
                // Low-pass filter to smooth the measurements
                tiltX = tiltX * (1-alpha) + CGFloat(data.acceleration.x) * alpha
                for (index, node) in enumerate(self!.children as! [SKNode]) {
                    // Move each layer by a different amount to produce parallax effect
                    let deltaX = tiltX*CGFloat(index+1)*self!.maxDistance
                    node.position = CGPoint(x:self!.size.width/2.0+deltaX, y:self!.size.height/2.0)
                }
            }
        }
    }

    func createLayer(color:SKColor, depth:CGFloat, screenSize:CGSize) -> SKNode {
        let scale = 1.0/depth
        let node = SKNode()
        // Scale layer to create depth effect
        node.setScale(scale)
        node.zPosition = -depth
        node.position = CGPoint(x:screenSize.width/2.0, y:screenSize.height/2.0)
        let size = CGSize(width: squareSize, height: squareSize)
        // Create squares at random positions
        for i in 1...10 {
            let square = SKSpriteNode(color: color, size: size)
            let x = CGFloat(arc4random_uniform(UInt32(screenSize.width))) - screenSize.width / 2.0
            let y = CGFloat(arc4random_uniform(UInt32(screenSize.height))) - screenSize.height / 2.0
            square.position = CGPoint(x:x, y:y)
            node.addChild(square)
        }
        return node
     }
 }

关于ios - 在SpriteKit中使用UIInterpolatingMotionEffect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32289832/

相关文章:

ios - 当 2 个用户进入 iOS 中的特定区域时连接他们

ios - SCNShadable - 改变纹理的变量和样本

ios - 在后台线程上执行的 Realm 写入仍然阻塞主 UI

javascript - html5 session 存储的替代方案是什么?(不是本地存储)

ios - 如何从 UiTableViewCell 更改 View Controller 中字典的值

iOS:如何使用 Quartz 测量字符串的宽度和高度?

iOS Swift,返回 View Controller 的同一实例

ios - Sprite-kit 如何将整数值传递到下一个场景

sprite-kit - EXC_BAD_ACCESS Sprite 套件

iphone - SKAction 未按预期工作