如果我没错,那么所有SKSpriteNode
都有它们的起源,也称为anchorPoint
。我想将该原点转换为节点顶行的中间位置。我在init()
方法中尝试了以下内容,但它不起作用:
self.anchorPoint = self.anchorPoint.applying(
CGAffineTransform.init(translationX: 0, y: self.frame.size.height/2)
)
PS:我用它来简化以下内容:
我创建了一个SpriteNodes数组,它们都处于新的CGPoint.zero
位置,然后,我必须在它们上面应用它:
for i in 0..<arr.count {
arr[i].position.y += self.size.height*CGFloat((i+1)/(arr.count+1))
}
import SpriteKit
class SKLayer: SKSpriteNode {
init(inside scene: SKScene, withLabels texts: [String]) {
super.init(texture: nil, color: .clear, size: scene.size)
self.anchorPoint = CGPoint(x: 0.5, y: 1)
converted(texts).forEach(self.addChild(_:))
self.anchorPoint = CGPoint(x: 0.5, y: 0.5)
self.position = .zero
}
private func converted(_ text: [String]) -> [SKNode] {
var arr = [SKLabelNode]()
text.forEach {
arr.append(SKLabelNode(text: $0))
}
for i in 0..<arr.count {
arr[i].position.y = CGFloat(i) * arr[0].frame.height
}
return arr
}
required init?(coder aDecoder: NSCoder) {
fatalError()
}
}
class GameScene: SKScene {
override func didMove(to view: SKView) {
self.addChild(
SKLayer(inside: self, withLabels: ["Welcome", "Hello", "Bye", "Help"])
)
}
}
我希望节点从上到下,而不是相反。嘿,我想在顶部看到“欢迎”标签,然后是“texT”标签,然后是其他标签。
答案 0 :(得分:4)
根据docs,
这就是锚点的工作原理:
锚点在单位坐标系中指定,如下图所示。单位坐标系将原点放置在框架的左下角,将(1,1)放置在框架的右上角。精灵的锚点默认为(0.5,0.5),它对应于帧的中心。
从这张图片中,我们可以看到要将锚点设置为顶部边框的中间位置,您需要将其设置为(0.5, 1)
。
您尝试将锚点转换为self.frame.size / 2
,这可能是大于1的数字。嗯,根据文档,(0, 0) - (1, 1)
的范围涵盖了精灵节点的整个帧。如果将其设置为大于(1,1)的值,则锚点将位于节点的框架之外。