如何更改SpriteKit的坐标系

时间:2017-09-04 08:08:07

标签: ios swift sprite-kit

如果我没错,那么所有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"])
    )
}

}

以下是代码编译的图片: ScreenShot

我希望节点从上到下,而不是相反。嘿,我想在顶部看到“欢迎”标签,然后是“texT”标签,然后是其他标签。

1 个答案:

答案 0 :(得分:4)

根据docs

这就是锚点的工作原理:

  

锚点在单位坐标系中指定,如下图所示。单位坐标系将原点放置在框架的左下角,将(1,1)放置在框架的右上角。精灵的锚点默认为(0.5,0.5),它对应于帧的中心。

enter image description here

从这张图片中,我们可以看到要将锚点设置为顶部边框的中间位置,您需要将其设置为(0.5, 1)

您尝试将锚点转换为self.frame.size / 2,这可能是大于1的数字。嗯,根据文档,(0, 0) - (1, 1)的范围涵盖了精灵节点的整个帧。如果将其设置为大于(1,1)的值,则锚点将位于节点的框架之外。