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

4
我们知道SKScene的原点在左下角。
但我尝试从包含0和1矩阵的文件中加载简单的关卡。其中0表示没有什么,1表示一个墙(简单的矩形)。
由于文件内容显然是从左上到右下的,因此我想从场景的左上角开始绘制。
但我的文件中的第一个字符被绘制在了场景的左下角。 我尝试将场景的yScale设置为-1,希望它能翻转y轴,但这并没有起作用
在这个SKScene上,最清晰的方法是始终从左上角开始绘制?我仍然想保持我的anchorPoint为0.5,0.5。
因此,从左上角绘制将位于x=-widthOfScreen/2y=heightOfScreen/2

请查看此答案:https://dev59.com/OHrZa4cB1Zd3GeqP3o3l#20734093 - Alessandro Ornano
不行,就像我在SKScene上写的yScale一样不起作用。控制台上会显示以下消息:“SKScene:设置SKScene的比例无效。” - NovumCoder
有趣的是,如果没有看到你的代码,我认为回答中的人可能无法更好地理解如何帮助你。尝试添加一些代码来回复这个问题。 - Alessandro Ornano
你可以使用一个 yScale 为 -1 的中间节点来实现这一点,但如果你想让你的绘图与场景中的其他所有内容匹配,最好是将你的墙壁向负方向绘制而不是正方向,并且不要尝试对所有东西进行转换。从长远来看,这会使事情变得更简单,因为与在代码中处理额外的转换层相比,它可能只是你的级别加载代码中的一个减号。 - cc.
3个回答

6
我不确定这是否符合您的要求,但如果您只是想更改坐标系,则可以创建一个CGPoint扩展,例如:
//CGPoint+SpriteKit.swift
extension CGPoint {
    func flipCoordinates() -> CGPoint {
        return CGPoint(x: x, y: UIScreen.mainScreen().bounds.height - y)
    }
}

我认为这应该可以正常工作,因为您的锚点是(0.5,0.5)


并不是完全按照我的做法,但我只是在绘制图块(关卡)和元素时简单地翻转了Y坐标。其他所有的东西都是按照通常的方式进行绘制,因为锚点在0.5,0.5处。但是,在一个点上翻转而不是对所有东西进行变换是最简单的方法。谢谢。 - NovumCoder
很棒的解决方案,我花了一天时间才知道为什么我的线条在底部绘制时显示在顶部,而在顶部绘制时与屏幕边缘保持相同的间距时显示在底部...它帮助我解决了SKScene问题。 - Dharini
想要将 SCNView 坐标转换成 SKView,这个方法完美解决了问题!非常感谢 Hayden,因为我太蠢了,在尝试了一个多小时后终于搞定了。 - user3069232

0

与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
// ...
}

0

由于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位置与视图大小对齐。

为什么在GameScene中使用动态派发?这对类是一种限制,是否有有效的理由? - Alessandro Ornano
有没有想法为什么我们不能直接对SKScene这样做? 我尝试过,但似乎没有任何作用。 - richy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接