SpriteKit/SKScene: 如何从左上而不是左下绘制?

SpriteKit/SKScene: How to draw from top-left instead from bottom-left?

我们知道 SKScene 的原点在左下角。

但我尝试从一个包含 0 和 1 矩阵的文件中加载一个简单的关卡。虽然 0 什么都不是,但 1 表示一堵墙(简单的矩形)。

由于文件内容明显是从左上到右下,我想在场景中从左上开始画

但是我文件中的第一个角色是在场景的左下角绘制的。 我尝试将场景的 yScale 设置为 -1,希望它反转 y 轴,但这没有用

最干净的方法是什么 SKScene 我总是从左上角开始画画?我仍然想将 anchorPoint 保持在 0.5,0.5。

所以从左上角开始绘图将位于 x=-widthOfScreen/2y=heightOfScreen/2

由于 SKSpriteNode 允许您使用 -1 的比例翻转其内容,因此您可以将所有节点置于 yScale 为 -1 的主 SKSpriteNode 下。

 final class GameScene: SKScene 
 {    
     var masterNode:SKSpriteNode! = nil
     override func addChild(node: SKNode) 
     {
        if masterNode == nil
        { 
           masterNode = SKSpriteNode()
           masterNode.position    = CGPoint(x:0, y:size.height)
           masterNode.anchorPoint = CGPointZero
           masterNode.yScale      = -1
           super.addChild(masterNode)        
        } 
        masterNode.addChild(node)
     }
 }

请注意,您需要保持 masterNode 的 y 位置与视图大小对齐if/when 大小会发生变化。

我不确定这是否是您想要的,但如果您只想更改坐标系,您可以做的是为 CGPoint 创建一个扩展,例如

//CGPoint+SpriteKit.swift
extension CGPoint {
    func flipCoordinates() -> CGPoint {
        return CGPoint(x: x, y: UIScreen.mainScreen().bounds.height - y)
    }
}

认为这应该可行,因为你的锚点是 (0.5, 0.5)

类似于 Alain T 的回答,但使用 SKCameraNodeyScale = -1,因此您不需要重写 addChild 函数或具有额外的节点层。

let localCamera = SKCameraNode()
override func didMove(to view: SKView) {
    super.didMove(to: view)

    localCamera.yScale = -1
    localCamera.position = CGPoint(x: size.width/2, y: size.height/2)
    addChild(localCamera)
    self.camera = localCamera
// ...
}