我已经使用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)
}
任何帮助或见解将不胜感激。多谢你们!
有很多事情要跟你去,我建议不要在SpriteKit中使用屏幕尺寸,一切都应该使用场景尺寸来完成 – Knight0fDragon
不要吝啬和贬低@ Knight0fDragon。这是苹果营销的直接结果,糟糕的文档记录以及多层次的主动和被动欺骗和混淆。在这个特殊情况下,戴夫,你正在努力解决苹果公司在处理屏幕尺寸和形状变化方面的差异,以及事实并非如此。这是一个人为的混乱。一旦你解开了他们对待多种屏幕尺寸和形状的方式,你会发现几乎所有其他的简单易用的简单描述(苹果公司)都是同样不真诚和蓄意的废话。 – Confused
这既不意味着也不贬意 – Knight0fDragon