zSKNode 相对于其父节点的位置?

2024-02-09

我一直认为 SKNode 的 zPosition 是相对于其父节点的,但现在我遇到了相反的效果。

我的场景中有两个父 SKNode,它们的 zPosition 分别为 1(节点 1)和 2(节点 2)。我想要实现的是,node2 应该始终位于 node1 之上。但不幸的是,node1 的子节点(zPosition 为 1-50)都位于 node2 的子节点(当前没有 zPosition)之上。有没有办法解决这个问题(除了给node2一个超过50的zPosition)?也许某种布尔参数来设置所有子节点相对于其父节点的 zPosition?任何帮助将不胜感激!

编辑:为了更清楚,这里是所有元素的层次结构:

  • node1:SKNode (zPosition 1)
    • child1:SKNode(z位置1)
    • child2:SKNode(z位置2)
    • child3:SKNode(z位置3)
    • ...
    • child50:SKNode(z位置 50)
  • node2:SKNode (zPosition 2)
    • child1:SKLabelNode(无 zPosition)
    • child2:SKLabelNode(无 zPosition)
    • child3:SKLabelNode(无 zPosition)
    • ...
    • child50:SKLabelNode(无 zPosition)

EDIT2:这是我的 GameScene 类的一个非常简化的版本:

import SpriteKit

class GameScene: SKScene {

    let gameNode = SKNode()
    let node1 = SKNode()
    let node2 = SKNode()

    let nodeSize:CGFloat = 50.0
    let spacing:CGFloat = 5.0

    required init(coder aDecoder: NSCoder) {
        fatalError("NSCoder not supported")
    }

    override init(size: CGSize) {
        super.init(size: size)

        self.addChild(gameNode)

        node1.name = "node1"
        node2.name = "node2"

        node1.zPosition = 1
        node2.zPosition = 2

        gameNode.addChild(node1)
        gameNode.addChild(node2)

        // add children to node1
        for i in 1..<10 {
            let child = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: nodeSize, height: nodeSize))
            child.position = CGPointMake((nodeSize + spacing) * CGFloat(i), 0)
            child.zPosition = CGFloat(i)
            self.node1.addChild(child)
        }

        // add children to node2
        for i in 1..<10 {
            let child = SKLabelNode(fontNamed: "Avenir Black")
            child.position = CGPoint(x: (nodeSize + spacing) * CGFloat(i), y: 0)
            child.text = "label\(i)"
            child.fontSize = 10
            child.fontColor = UIColor.blackColor()
            self.node2.addChild(child)
        }
    }
}

当您运行它时,您可以看到只有node2(标签1)的第一个子节点位于node1的第一个子节点之上(因为它们具有相同的zPosition)。所有其他节点都位于 node1 的子节点下方。


阅读时苹果文档 https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Nodes/Nodes.html关于这一点,你可以找到:

维护节点子节点的顺序可能需要大量工作。相反,您可以为场景中的每个节点指定一个明确的高度。您可以通过设置节点的 zPosition 属性来完成此操作。 z 位置是节点相对于其父节点的高度,就像节点的位置属性表示其相对于父节点位置的 x 和 y 位置一样。因此,您可以使用 z 位置将节点放置在父级位置的上方或下方。

当考虑 z 位置时,节点树如下所示 呈现:

  • 计算每个节点的全局 z 位置。
  • 节点按从最小 z 值到最大 z 值的顺序绘制。
  • 如果两个节点共享相同的 z 值,则先渲染祖先节点,然后按子节点顺序渲染兄弟节点。

我发现的一点 - 我不知道是这样的 - 孩子的 zPosition 是通过对他们的父母 zPosition 求和计算得出的,所以如果node1.zPosition + (node1's)child3.zPosition = 4, and node2.zPosition + (node2's)child3.zPosition = 3,node1 的子节点将被绘制在上面。

解决方案:设置node2.zPosition大于(node1's)lastChild.zPosition + node1.zPosition.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

zSKNode 相对于其父节点的位置? 的相关文章

随机推荐

  • 如何使用 jQuery 添加 DOM 元素?

    我有一个当前用来显示隐藏 div type 的函数 我怎样才能修改这段代码 而不是在隐藏的div中淡出 我可以将新的 div 添加到 DOM jQuery function Add Answer jQuery add answer clic
  • 将文本显示到另一个类的标签 - JFrame

    我有一个 GUI 屏幕 里面有一个标签 我现在想用文本设置标签 如下所示 Test 但它没有得到更新 我认为以下代码中有错误 我在 try 块中重新创建了 FrameTest 的新对象 FrameTest frame new FrameTe
  • 如何让puppeteer通过socks5代理工作?

    我购买了socsk5的代理服务器版本 所有手册中都有相同的示例 const browser await puppeteer launch headless true ignoreHTTPSErrors true defaultViewpor
  • 更改 Qt5 中 QGraphicsScene/View 中的像素图位置

    我有一个普通的 QGraphicsView QGraphicsScene 我想要做的就是将 QPixmap png 加载到图形并手动设置该 QPixmap 图像的位置 我找到了解决方案 但它们不适用于 Qt5 关于如何在 Qt5 上实现这一
  • ionic externalRootDirectory 无法写入 SD 卡

    我一直在尝试使用 IONIC 中的 cordova plugin file 插件写入 Android 设备上的 可移动 SD 卡 但没有成功 该文档指定了 externalRootDirectory 为 Android 外部存储 SD 卡
  • 无法建立 SSL 连接

    我正在使用第三方库 Splunk C SDK http dev splunk com csharp 在我的 ASP NET Core 应用程序中 我尝试通过此 SDK 连接到我的本地主机 Splunk 服务 但出现异常 System Net
  • ASP.NET - Ajax 控件工具包 - TabContainer 始终隐藏

    我使用以下代码将 TabContainer 添加到页面
  • SonarQube 测试覆盖 .NET 5

    我想在本地 SonarQube 实例 在 Windows 上 中显示 NET 5 单元测试的测试覆盖率 dotnet sonarscanner begin k MyProject d sonar host url http localhos
  • Stream_socket_client 无法连接到 Apple APNS(权限被拒绝)

    我遇到过通过 php 发送推送通知的罕见情况 但我无法弄清楚 我有一个简单的 php 脚本 可以发送如下所示的通知 如果我通过命令行 php script php 执行此文件 它就可以正常工作 如果我通过网络执行http domain co
  • 使用计算表达式避免厄运金字塔?

    我碰到这个问题 https stackoverflow com questions 39858643 getting rid of the pyramid of doom in f关于 F 中的 末日金字塔 那里接受的答案涉及使用活动模式
  • Rails:这种带有关联条件的多重连接有什么问题?

    这是我的模型 class Deck lt ActiveRecord Base belongs to game has many deck cards end class DeckCard lt ActiveRecord Base belon
  • R:使用 recode、mutate 和 case_when 重新编码变量

    我想为数据集中由 core vars 定义的以下变量重新编码以下值 4 1 并仍将其余变量保留在数据框中 temp df lt as tibble mtcars other vars lt c hp drat wt core vars lt
  • Scala中如何避免依赖注入?

    I read 没有体操的依赖注入 PDF http phillyemergingtech com 2012 system presentations di without the gymnastics pdf这表明不需要任何花哨的 DI 框
  • 使用 Bottle 框架进行 Python 粘贴 Broken Pipe Error

    我正在使用 Bottle 框架实现 WSGI 请求和响应 并且由于单线程问题 我将服务器更改为 PythonWSGIServer 并使用 Apache bench 进行测试 但结果包括错误损坏的管道 这与这个问题类似如何防止errno 32
  • PYTHON 的 Tcl 文件解析器

    我有一个 tcl 文件 是否有任何解析器可以直接从 tcl 文件中提取数据 我不想使用 REGEX 来完成此任务 pyparsing 可以解决这个问题吗 我正在使用Python 2 7 tcl 文件不是数据文件 它们是用 Tcl 编程语言编
  • 第三方类的 TypeConverter 属性

    创建类时 可以对其应用 TypeConverter 属性 使用 TypeDescriptor GetConverter typeof T 返回自定义类型转换器 例如 TypeConverter typeof FooConverter pub
  • 我可以从内部函数中屈服吗?

    使用 ES6 生成器 我看到这样的代码 var trivialGenerator function array var i item for var i 0 i lt array length i item array i yield it
  • 降级Python后spyder/jupyter无法工作

    我必须将 python 版本从 3 5 下载到 3 4 因为 3 5 不支持我需要的包之一 我使用 conda 命令提示符降级了 python 版本 一切正常 让我的包及其所有依赖项一起安装 没有冲突 但现在当我尝试打开 Juypter 笔
  • 如何向引导卡添加关闭按钮?

    我有一个使用以下代码的引导卡 div class card card outline danger text center span class pull right clickable i class fa fa times i span
  • zSKNode 相对于其父节点的位置?

    我一直认为 SKNode 的 zPosition 是相对于其父节点的 但现在我遇到了相反的效果 我的场景中有两个父 SKNode 它们的 zPosition 分别为 1 节点 1 和 2 节点 2 我想要实现的是 node2 应该始终位于