在 SKNode 子类中实现 anchorPoint

Posted

技术标签:

【中文标题】在 SKNode 子类中实现 anchorPoint【英文标题】:Implementing anchorPoint in SKNode subclass 【发布时间】: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
    

【问题讨论】:

【参考方案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)
    

【讨论】:

以上是关于在 SKNode 子类中实现 anchorPoint的主要内容,如果未能解决你的问题,请参考以下文章

在子类的子类中实现 NSCopying

在 UICollectionView 子类中实现 UIScrollViewDelegate

强制在子类中实现 toString()

在子类中实现纯虚方法

子类化使用 SpriteKit .sks 场景文件创建的 SKNode

如何在基类中实现子类迭代器的统一接口?