为什么SKSpriteNodes只是部分渲染?

时间:2016-11-07 20:45:03

标签: ios swift sprite-kit rendering skspritenode

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

我创建了所有六个,然后创建了一个动作,可以向左或向右移动所有6张牌,以选择玩家想要的牌。中心的那个是被选中的那个。

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

如果我只选择显示6张卡片中的5张,那么它们就会很棒。

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

我尝试使用场景和视图尺寸和比例,并没有任何改进。

我尝试过使用不同的图片,根本没有任何变化。

我已经仔细检查了所有zPositions,但未发现任何改进。

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

我已将它们放在自己的"层"这是一个名为cardNode的SKEffectNode。 (它是一个SKEffectNode,因为我选择稍后在警报屏幕出现时将其模糊)。我认为将它们放在自己的图层上可能有所帮助,但它没有。

我已经将物理机构放在卡片上,以确保它们仍然是#34;那里"并且物理实体出现在正确的位置。如果我单击未被渲染的节点的一部分,它仍然会表现得正常,就像它仍然在该区域中呈现一样。

我无法弄清楚从哪里开始解决这个问题。理想情况下,我希望将来能够添加更多卡片,但却会遇到这个问题。

以下是我创建卡片的代码。

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)

}

非常感谢任何帮助或见解。谢谢你们!

1 个答案:

答案 0 :(得分:0)

我今天整天都在尝试通过调整场景和视图来找到一种方法来完成这项工作,并且根本没有运气。

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