【问题标题】:Extend SKAction to override timingMode扩展 SKAction 以覆盖timingMode
【发布时间】:2017-06-23 04:25:24
【问题描述】:

我在 SpriteKit 项目中有许多 SKAction。 SKActions 的默认时间模式是“线性”。是否可以使用扩展来覆盖此时间模式默认值,例如"easeInEaseOut" 所以所有 SKActions 都有timingMode = easeInEaseOut?

我尝试了各种“扩展”样式,但没有一个会编译 - 通常返回“在其自己的类型中使用的'timingMode'”或“Initializer 'init()' 与 Objective-C 选择器 'init' 冲突与隐式初始化器 'init ()' 与相同的 Objective-C 选择器"

文档似乎没有给出任何例子,但这样做肯定是一件有用的事情吗?尤其是当您的游戏中有数百个 SKAction 时?

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    选择你的毒药,一个扩展 action 让你快速调用 .easeInEaseOut 计时模式,另一个扩展 SKNode 让你使用特定的计时模式运行。

    没有办法改变默认行为,唯一的另一种方法是为每个存在的动作创建自己的静态方法,这可能会变得很麻烦。

    extension SKAction
    {
        //e.g. SKAction.move(to: CGPoint.zero, duration: 10).easeInEaseOut()
        func easeInEaseOut() -> SKAction
        {
    
            self.timingMode = .easeInEaseOut
            return self
        }
    
    
    }
    extension SKNode
    {
        func runWithEaseInEaseOut(action:SKAction,withKey key: String = "")
        {
            action.timingMode = .easeInEaseOut
            if key != ""
            {
                self.run(action,withKey:key)
            }
            else
            {
                self.run(action)
            }
        }
    
    }
    

    【讨论】:

    • 非常感谢您的宝贵时间。是的,这是一个帮助。我喜欢第一个,很容易添加到在动作序列中创建的动作等中。你不能简单地在全局范围内扩展和/或覆盖,这对 Swift 非常没有帮助。
    • 它是静态的,它有助于提高效率
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 2017-06-28
    相关资源
    最近更新 更多