2016-11-07 108 views
1

我已经使用Swift和SpriteKit为游戏中的关卡选择编写了“卡片”的基本布局。基本上只有6级选择卡并排显示用户可以选择的级别图片。要创建它们,我正在运行一个for循环,并将第一个放置在屏幕的中心,填充,然后是第二个,然后填充等等。每张卡片都是来自png图像的SKSpriteNode。每张卡约为设备宽度的三分之一,约为设备高度的三分之一。为什么SKSpriteNodes只能部分渲染?

我创建了它们全部六个,然后创建了一个动作,将所有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,发现没有改进。

我试图系统地删除场景中的所有其他对象,仍然有问题。

我已经把它们放在它们自己的“layer”上,它是一个名为cardNode的SKEffectNode。 (这是一个SKEffectNode,因为我选择稍后在警报屏幕出现时模糊它)。我认为把它们放到自己的层上可能会有所帮助,但事实并非如此。

我已经把物理实体放在卡片上,以确保它们仍然存在,物理实体出现在正确的位置。如果我点击未呈现的部分节点,它仍然表现得很好,就好像它仍然在该区域中渲染一样。

我不知道从哪里去解决这个问题。理想情况下,我想在未来添加更多卡,但会陷入这个问题。

这是我创建卡的代码。

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) 

} 

任何帮助或见解将不胜感激。多谢你们!

+2

有很多事情要跟你去,我建议不要在SpriteKit中使用屏幕尺寸,一切都应该使用场景尺寸来完成 – Knight0fDragon

+1

不要吝啬和贬低@ Knight0fDragon。这是苹果营销的直接结果,糟糕的文档记录以及多层次的主动和被动欺骗和混淆。在这个特殊情况下,戴夫,你正在努力解决苹果公司在处理屏幕尺寸和形状变化方面的差异,以及事实并非如此。这是一个人为的混乱。一旦你解开了他们对待多种屏幕尺寸和形状的方式,你会发现几乎所有其他的简单易用的简单描述(苹果公司)都是同样不真诚和蓄意的废话。 – Confused

+0

这既不意味着也不贬意 – Knight0fDragon

回答

0

我今天尝试了一整天,试图通过调整场景和视图的大小来找到一种方法来完成这项工作,而且根本没有任何运气。

我的解决方案是检查设备类型,如果它是iPad,我将减少图像大小和图像之间的缓冲区,直到它不切断它们。我不认为这是一个很好的解决方案,只是一个解决办法,直到我可以找到一个更好的方式来做到这一点。不过谢谢你们的想法。我绝对感激!