【问题标题】:SpriteKit/SKScene: How to draw from top-left instead from bottom-left?SpriteKit/SKScene:如何从左上角而不是左下角绘制?
【发布时间】:2016-08-03 01:05:07
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 不,因为我在 SKScene 上写的 yScale 不起作用。在控制台上获取消息:SKScene:设置 SKScene 的比例无效。
  • 有趣但没有看到你的代码我认为回答的人不能更好地理解如何帮助你,尝试添加一些代码来回复这个问题
  • 您可以使用 yScale 为 -1 的中间节点来实现此目的,但如果您希望您的绘图与场景中其他所有内容的坐标系相匹配,最好的办法是只绘制你的墙在负方向而不是正方向,不要试图改变一切。我敢打赌,从长远来看,它会让事情变得更简单,因为与在整个代码中处理额外的转换层相比,它可能是关卡加载代码中某处的一个减号。

标签: ios swift sprite-kit skscene


【解决方案1】:

我不确定这是否是你想要的,但如果你只是想改变坐标系,你可以做的是为 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,所以我一直以通常的方式绘制其他所有内容。但是,在某一点翻转而不是改变一切是最简单的方法。谢谢。
  • 很好的解决方案,我花了 1 天的时间来了解为什么我的线条显示在顶部,而在底部绘制时以及在顶部绘制时它显示在底部,与屏幕边缘的空间相同......它帮助我解决 SKScene 问题
【解决方案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)
     }
 }

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

【讨论】:

  • 为什么要对 GameScene 使用动态调度?这是对班级的限制,有正当理由吗?
  • 知道为什么我们不能直接向SKScene 这样做吗?我试过了,它似乎没有做任何事情。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2017-10-25
    相关资源
    最近更新 更多