【问题标题】:SKTileMapNode disappears when off-camera, does not reappear离机时SKTileMapNode消失,不再出现
【发布时间】:2021-07-10 16:54:59
【问题描述】:

我有一个使用平铺地图作为背景的 SpriteKit 平台游戏。有问题的背景位于主要内容上方 1 个屏幕高度(位于屏幕外),充当玩家上方的森林树冠。我以编程方式完成,如下所示:

let screenWidth = UIScreen.main.bounds.width
let screenHeight = UIScreen.main.bounds.height
let columns = 20
let rows = 1
let tileSize = CGSize(width: screenWidth, height: screenHeight)

let container = SKSpriteNode()
let tileDefinition = SKTileDefinition(texture: MainData.textureAtlas.textureNamed("someTexture"), size: CGSize(width: screenWidth, height: screenHeight))
let tileGroup = SKTileGroup(tileDefinition: tileDefinition)
let tileSet = SKTileSet(tileGroups: [tileGroup])
let layer = SKTileMapNode(tileSet: tileSet, columns: columns, rows: rows, tileSize: tileSize)

container.position = CGPoint(x: screenWidth*0.5, y: screenHeight*1.5)
container.size = CGSize(width: CGFloat(columns)*screenWidth, height: screenHeight)
container.zPosition = 3.0

layer.fill(with: tileGroup)
                
container.addChild(layer)
addChild(container)

一个相机节点跟随玩家。

问题:如果玩家跳起来,SKTileMapNode 会在他下来时消失。它永远不会再次出现。它的父节点container 仍然可见,所以我认为问题出在SKTileMapNode,而不是container

我尝试过的: 我尝试了以下方法,检查了数字 2-5 是否为SKTileMapNode

  1. 设置view.shouldCullNonVisibleNodes = false
  2. 检查alpha 值。总是1.0
  3. 检查position。总是CGPoint(x: 0, y: 0)
  4. 检查anchorPoint。总是CGPoint(x: 0.5, y: 0.5)
  5. 检查zPosition。它不会改变,并且没有其他节点可以遮挡SKTileMapNode 或其父节点。设置更高的值对问题没有影响。
  6. 检查container 是否仍然可见。确实如此。

关于剔除: 看起来问题应该与剔除有关,但设置view.shouldCullNonVisibleNodes=false 对这种情况没有影响。我还检查以确保SKTileMapNode 始终作为container 的子节点存在。这是。我想这意味着该节点 没有 被剔除。但是,如果我将container 定位为始终在-屏幕上,则根本不会出现问题; SKTileMapNode 仍然可见。这让我很困惑,因为这些似乎是相互矛盾的事实。

在设备上: 使用模拟器,至少在 SE 和 iPhone 8 等老式 iPhone 上不会出现问题。它 仅在较新的 iPhone 上发生,例如 iPhone 11 和 iPhone 12. 使用 iPhone 11,我可以确认问题也出现在真实设备上。

问题:为什么我的SKTileMapNode 在离机时会消失(即使禁用了剔除)?如何保持此节点可见?

谢谢!

【问题讨论】:

  • 为什么container.addChild(layer5) 显示layer5?不应该是layer吗?
  • @JohnL 哎呀。我将问题编辑为仅包含layer。感谢您指出这一点!
  • 我认为你应该使用showsNodeCount,如果你说的是真的,当玩家跳跃并返回时,数字应该减少。重复使用不同的模拟器设备。也许还可以更改 didMoveTo 中的相机 xscale 和 yscale (因此它会进一步缩小),以查看您跳跃时 tilenode 的位置。
  • 感谢您的帮助。我刚刚检查了节点数。当SKTileMapNode 消失时,它确实 NOT 减少,这很有趣。我还尝试更改相机的比例,使内容显示为缩小,这导致问题 NOT 发生(可能是因为节点永远不会离开屏幕)。但是,我已经知道SKTileMapNode 不会移动 任何地方,因为我在玩家跳跃之前和之后检查了它的positionanchorPoint。正如我在第 3 点和第 4 点中提到的,这些值保持不变。我所做的缩小检查证实了缺乏运动。
  • 好的。我确定 tilenode 仍然在某个地方。 layer.zposition 是什么? (我只能看到容器)。我想你可以在更新中使用print(container.children),以确保在你跳转后它就在那里。

标签: ios swift sprite-kit sktilemapnode skcameranode


【解决方案1】:

看来我已经解决了问题。

我通过 SwiftUI SpriteView 呈现我的场景,我已将其配置为允许背景透明,如下所示:

SpriteView(scene: theScene, options: [.allowsTransparency])

去掉透明度选项解决了这个问题:

SpriteView(scene: theScene)

现在,为什么会这样?我不知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多