SKTileMapNode 在离机时消失,不会重新出现
SKTileMapNode disappears when off-camera, does not reappear
我有一个使用瓦片地图作为背景的 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
:
- 设置
view.shouldCullNonVisibleNodes = false
.
- 正在检查
alpha
值。总是 1.0
.
- 正在检查
position
。总是 CGPoint(x: 0, y: 0)
.
- 正在检查
anchorPoint
。总是 CGPoint(x: 0.5, y: 0.5)
.
- 正在检查
zPosition
。它不会改变,并且没有其他节点可以遮挡 SKTileMapNode
或其父节点。设置更高的值对问题没有影响。
- 正在检查
container
是否仍然可见。确实如此。
关于剔除:
看起来问题应该与剔除有关,但是设置 view.shouldCullNonVisibleNodes=false
对这种情况没有影响。我还检查以确保 SKTileMapNode
始终作为 container
的子节点存在。这是。我想这意味着该节点 而不是 被剔除。但是,如果我将 container
定位为始终在 上 -screen,则问题根本不会发生; SKTileMapNode
仍然可见。这让我很困惑,因为这些似乎是相互矛盾的事实。
在设备上:
至少,使用模拟器,问题确实 不会 出现在旧式 iPhone 上,例如 SE 和 iPhone 8。它
只发生在较新的 iPhone 上,例如 iPhone 11 和 iPhone
12. 访问 iPhone 11,我可以确认问题也发生在真实设备上。
问题:为什么我的 SKTileMapNode
在离机时消失了(即使禁用了剔除)?我怎样才能让这个节点可见?
谢谢!
看来我的问题已经解决了
我正在通过 SwiftUI SpriteView
展示我的场景,我已将其配置为允许背景透明,如下所示:
SpriteView(scene: theScene, options: [.allowsTransparency])
删除透明度选项解决了问题:
SpriteView(scene: theScene)
现在,为什么会这样?我不知道。
我有一个使用瓦片地图作为背景的 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
:
- 设置
view.shouldCullNonVisibleNodes = false
. - 正在检查
alpha
值。总是1.0
. - 正在检查
position
。总是CGPoint(x: 0, y: 0)
. - 正在检查
anchorPoint
。总是CGPoint(x: 0.5, y: 0.5)
. - 正在检查
zPosition
。它不会改变,并且没有其他节点可以遮挡SKTileMapNode
或其父节点。设置更高的值对问题没有影响。 - 正在检查
container
是否仍然可见。确实如此。
关于剔除:
看起来问题应该与剔除有关,但是设置 view.shouldCullNonVisibleNodes=false
对这种情况没有影响。我还检查以确保 SKTileMapNode
始终作为 container
的子节点存在。这是。我想这意味着该节点 而不是 被剔除。但是,如果我将 container
定位为始终在 上 -screen,则问题根本不会发生; SKTileMapNode
仍然可见。这让我很困惑,因为这些似乎是相互矛盾的事实。
在设备上: 至少,使用模拟器,问题确实 不会 出现在旧式 iPhone 上,例如 SE 和 iPhone 8。它 只发生在较新的 iPhone 上,例如 iPhone 11 和 iPhone 12. 访问 iPhone 11,我可以确认问题也发生在真实设备上。
问题:为什么我的 SKTileMapNode
在离机时消失了(即使禁用了剔除)?我怎样才能让这个节点可见?
谢谢!
看来我的问题已经解决了
我正在通过 SwiftUI SpriteView
展示我的场景,我已将其配置为允许背景透明,如下所示:
SpriteView(scene: theScene, options: [.allowsTransparency])
删除透明度选项解决了问题:
SpriteView(scene: theScene)
现在,为什么会这样?我不知道。