【问题标题】:Implementing anchorPoint in SKNode subclass在 SKNode 子类中实现 anchorPoint
【发布时间】:2015-04-08 05:57:58
【问题描述】:

我有一个继承自 SKNode 的自定义类,并希望在该类上实现 SKSpriteNode 的类似锚点的功能。具体来说,我想要实现的是自动将自定义节点居中在父节点中(anchorPoint 在 0.5、0.5),而不必将其偏移其宽度/高度的一半。

有什么建议吗?

编辑:我首先创建了一个anchorPoint变量,然后覆盖了位置变量并设置了anchorPoint修改的超级位置。

var anchorPoint = CGPoint(x: 0.5, y: 0.5)

override var position: CGPoint {
    set {
        super.position = CGPoint(x: self.position.x - self.size.width * self.anchorPoint.x, y: self.position.y - self.size.height * self.anchorPoint.y)
    }
    get {
        return super.position
    }
}

【问题讨论】:

    标签: swift sprite-kit


    【解决方案1】:

    您可以覆盖继承类的setPosition 函数。在此函数中,您将调整偏移锚点。

    例如,如果您的精灵是 100x100。并且您已将其锚点设置为(.5,.5),当有人设置位置时,您应该从中添加或减去精灵尺寸,然后设置位置。 在这种情况下,如果用户将精灵位置设置为 (0,0),您将添加 (100*.5,100*.5) = (50,50)。加上 (0,0) 就是 (50,50)。

    这是您应该设置的新位置。

    【讨论】:

    • 感谢您的帮助。我最终覆盖了位置变量,因为 swift 没有 setPosition 函数。请参阅上面的编辑。
    【解决方案2】:

    在您的控件的 SKNode 下添加一个新的“根”SKNode 可能会更容易,向其添加任何子节点,然后在更改 anchorPoint 属性时移动它。我就是这么做的。

    var anchorPoint: CGPoint = CGPoint( x: 0.5, y: 0.5 )
    {
        didSet
        {
            let translateX = ( anchorPoint.x - 0.5 ) * controlSize.width
            let translateY = ( anchorPoint.y - 0.5 ) * controlSize.height
            rootNode!.position = CGPoint(x: translateX, y: translateY)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多