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


正如我们所知,SKScene的原点在左下角。

但我尝试从一个包含0和1矩阵的文件中进行简单级别的加载。虽然0不算什么,但1表示墙(简单矩形(。

由于文件的内容显然是从左上到右下的,我想在场景中从左上绘制。

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

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

因此,从左上角开始的绘图将位于x=-widthOfScreen/2y=heightOfScreen/2

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

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

我认为这应该有效,因为你的锚点是(0.5,0.5(

由于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)
     }
 }

请注意,如果/当大小发生变化时,需要保持主节点的y位置与视图大小对齐。

类似于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
// ...
}

最新更新