【问题标题】:Alternative way to fade the background color into another color将背景颜色淡入另一种颜色的替代方法
【发布时间】:2016-01-22 04:13:28
【问题描述】:

在我的 touches started 方法中,我输入了这行简单的代码,将背景颜色变为红色。

 runAction(SKAction.colorizeWithColor(SKColor.redColor(), colorBlendFactor: 1.0, duration: 1.0))

一切正常,但问题是代码在使用 ios 7 时没有做任何事情。我想知道是否有另一种方法可以使背景淡入不同的颜色,或者是否有 ios 7 版本这段代码。

【问题讨论】:

  • colorizeWithColor SKAction 在 iOS 7 中可用。您是在设备上测试还是在模拟器上测试?
  • 不久前我想出了一个过度设计的解决方案来解决这个问题......见stackoverflow.com/a/21686221/2976878
  • 谢谢,我正在使用 ios 7 的设备上测试它

标签: sprite-kit swift2


【解决方案1】:

有多种方法可以从一种颜色过渡到另一种颜色。最直接的方法之一是通过将逐渐增大的起始颜色 RGB 分量与逐渐减小的结束颜色 RBG 分量组合起来,在两种颜色之间进行线性插值:

red = starting_red * (1.0 - fraction) + ending_red * fraction
green = starting_green * (1.0 - fraction) + ending_green* fraction
blue = starting_blue * (1.0 - fraction) + ending_blue * fraction

fraction 从 0 开始,以 1 为增量结束

fraction += delta_time * step_size

实现此方法的一种方法是将代码添加到GameScenedidMoveToView 方法。但是,如果您的游戏包含多个场景,更好的策略是扩展 SKAction 以添加创建自定义动作的类方法,以便所有场景都可以使用它。

首先,定义一个结构来存储开始和结束的 RGB 颜色分量。将此添加到 GameScene 的定义之外。

struct ColorComponents {
    var red:CGFloat
    var green:CGFloat
    var blue:CGFloat

    init(color:SKColor) {
        self.init()
        var alpha:CGFloat = 0
        color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
    }

    init() {
        red = 0
        green = 0
        blue = 0
    }
}

然后,通过添加以下将背景颜色更改为另一种颜色的方法来扩展SKAction。请注意,扩展必须在类之外定义。

extension SKAction {
    static func changeColor(startColor:SKColor, endColor:SKColor, duration:NSTimeInterval) -> SKAction {
        // Extract and store starting and ending colors' RGB components
        let start = ColorComponents(color: startColor)
        let end = ColorComponents(color: endColor)
        // Compute the step size
        let stepSize = CGFloat(1/duration)
        // Define a custom class to gradually change a scene's background color
        let change = SKAction.customActionWithDuration(duration) {
            node, time in
            let fraction = time * stepSize
            let red = start.red * (1.0 - fraction) + end.red * fraction
            let green = start.green * (1.0 - fraction) + end.green * fraction
            let blue = start.blue * (1.0 - fraction) + end.blue * fraction
            if let scene = node as? SKScene {
                scene.backgroundColor = SKColor(red: red, green: green, blue: blue, alpha: 1.0)
            }
        }
        return change
    }
}

最后,创建并运行SKAction

runAction(SKAction.changeColor(backgroundColor, endColor: SKColor.blueColor(), duration: 5))

将此添加到您的SKScene 子类中的didMoveToView,例如GameScene

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多