为什么 SKSpriteNodes 只呈现部分?

Why are SKSpriteNodes only partially rendering?

我使用 Swift 和 SpriteKit 在游戏中为 selection 级别编写了 "cards" 的基本布局。基本上只有 6 张级别 select 并排的离子卡,上面有一张用户可以 select 级别的图片。为了创建它们,我 运行 设置了一个 for 循环并将第一个放在屏幕中央,一个填充,然后是第二个,然后是填充等。每张卡片都是来自 png 图像的 SKSpriteNode。每张卡片的宽度约为设备的三分之一,高度约为设备的三分之一。

我创建了所有六张牌,然后创建了一个将所有 6 张牌向左或向右移动到玩家想要的 select 的动作。中间的那个是 selected 的那个。

在 iphone 模拟器上一切正常(在 iPhone 6、iPhone 6 plus、iPhone 7 Plus 和 iPhone 5 上测试...一切都很好)。在 iPad 模拟器上,第一张和最后一张卡片有一部分图像根本没有渲染。第一张牌有大约 1/4 丢失在左侧,最后一张牌有大约 1/4 或丢失在最右侧。我也在物理 iPad 上尝试 运行ning 它,但它有同样的问题。当我 运行 它在 iPad Pro 12.7 上时,它变得更糟......它切断了更多的图像。

如果我选择只显示 6 张卡片中的 5 张,它们都呈现得很好。

如果我选择将它们缩小到设备宽度的大约 1/4 和设备高度的 1/4 并减少填充,它们渲染得很好。

我尝试调整场景和视图的大小和比例,但没有任何改进。

我试过使用不同的图像,但没有任何变化。

我仔细检查了所有 zPositions,没有发现任何改进。

我已经尝试系统地移除场景中的所有其他对象,但问题仍然存在。

我把它们放在自己的 "layer" 这是一个名为 cardNode 的 SKEffectNode。 (它是一个 SKEffectNode,因为我选择稍后在它前面出现警告屏幕时对其进行模糊处理)。我认为将它们放在自己的图层上可能会有所帮助,但事实并非如此。

我将物理体放在卡片上只是为了确保它们仍然 "there" 并且物理体出现在正确的位置。如果我单击未渲染的节点部分,它仍然会正常运行,就好像它仍在该区域中渲染一样。

我不知道从哪里可以解决这个问题。理想情况下,我想在未来添加更多卡片,但遇到了这个问题。

这是我创建卡片的代码。

let cardNode = SKEffectNode()

let levelCardArray: [String] = [
    "BlackBoxLevelCard.png"
    ,"FruitLevelCard.png"
    ,"SportsLevelCard.png"
    ,"BarnLevelCard.png"
    ,"SeaLevelCard.png"
    ,"SpaceLevelCard.png"
]

let screenWidth = UIScreen.main.bounds.width
let screenHeight = UIScreen.main.bounds.height

let w10 = screenWidth * 0.10
let w40 = screenWidth  * 0.40
let w50 = screenWidth  * 0.50
let w60 = screenWidth  * 0.60

let h50 = screenHeight  * 0.50

let cardMargin = w10
let cardSize = CGSize(width: w40, height: w60)
let startPosition = CGPoint(x: w50, y: h50)

override func didMove(to view: SKView) {

    let scene = levelSelectionScene(size: view.bounds.size)
    scene.backgroundColor = UIColor.black
    let skView = view as SKView
    skView.ignoresSiblingOrder = true

    cardNode.zPosition = 100
    self.addChild(cardNode)

for i in 1...levelCardArray.count {

 let currentArrayValue = i - 1

  let cardSprite = SKSpriteNode(imageNamed: levelCardArray[currentArrayValue])
  cardSprite.size = cardSize
  cardSprite.position = CGPoint(x: startPosition.x + (CGFloat(currentArrayValue) * (cardSize.width + cardMargin)), y: startPosition.y)
  cardSprite.zPosition = cardNode.zPosition
  cardSprite.name = "levelCardObject"
  cardNode.addChild(cardSprite)

}

任何帮助或见解将不胜感激。谢谢大家!

我今天一整天都在努力寻找一种方法来通过调整场景和视图的大小来完成这项工作,但一点运气都没有。

我的解决方案是检查设备类型,如果它是 iPad 我正在减小图像大小和图像之间的缓冲区,直到它不会切断它们。我认为这不是一个很好的解决方案,实际上只是一种解决方法,直到我找到更好的方法为止。谢谢你们的想法。我非常感谢!