在 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的主要内容,如果未能解决你的问题,请参考以下文章
在 UICollectionView 子类中实现 UIScrollViewDelegate