在场景上定位节点以适用于所有屏幕尺寸SpriteKit

时间:2016-06-24 08:47:21

标签: ios sprite-kit skspritenode aspect-ratio skscene

我已经尝试了一切,似乎没有什么能用于定位通用SpriteKit游戏的节点。我目前使用.AspectFill作为我的缩放比例,我尝试制作不必要的复杂算法,使我的游戏中的主菜单(例如按钮,标题图像等)适合场景的边界或子部分。我甚至尝试过相对于场景的可见部分定位的东西。例如

 sprite.position = CGPoint(scene.size.width/2, scene.size.height/2 + scene.size.height * 0.4) 

并且这适用于游戏元素,例如玩家我认为这种方法非常难以预测HUD和菜单屏幕元素定位因为按钮然后倾向于重叠,因为精灵的动态调整和/或取决于场景的未知缩放在用户的设备上(如果我将它完美地定位在iPhone上,它就会从iPad的屏幕上移开,反之亦然)例如

sprite.size = CGSize(screen.size.width * 0.6, screen.size.width * 0.6)

然后我开始对SKSpriteNode进行扩展,以便它可以根据给定的边界(CGRect)调整自身大小,然后我意识到在我的场景中定位一个节点是多么复杂,混乱和耗时。我必须完全错误地想法在我的场景中定位节点,否则我做错了。现在您了解这里的背景是我的问题:

  • 我应该对这些位置进行硬编码(我听说这不是一个很好的方法,但是由于SpriteKit不能进行缩放,所以不应该这样做吗?)
  • 或者我应该根据每个设备的宽高比创建动态位​​置,例如

if scene.size.width/scene.size.height >= 16/9 { //Create position here for this device } else if scene.size.width/scene.size.height >.... { etc etc

这种方法似乎也没必要,但我可能错了

OR

  • 解决方案是否是我不知道的其他方法

我不能成为唯一一个有这个问题的人,并且经过几个小时的研究阅读每一个stackoverflow答案和网页谷歌回复给我可能有我的答案我仍然没有找到适用于我的问题的解决方案。这个问题已被多次询问,但显然答案与我的学习风格不符,需要以不同的方式解释,以便我最终理解它,并且应用程序商店中的应用程序数量肯定有人容易这个压力问题的解决方案让我感到无动于衷地制作我的应用程序而且情况不应该如此。

1 个答案:

答案 0 :(得分:0)

由于您使用AspectFill作为scaleMode,因此场景会自动缩放它。这样,您将使屏幕大小为768x1024(纵向)或1024x768(横向)。为了使其与所有设备兼容,只需将背景设为1024x1024即可在iPad上看起来很好,只需通过以下操作即可调整iPad的HUD元素:

if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
    yourButton.position.y += 100
    yourLabel.position.y += 100
    etc
 }

您不需要任何复杂的算法,所有屏幕上的场景都很棒。我还建议你将屏幕的anchorPoint更改为中间,这样你就可以从中间而不是从左下角定位所有节点,因为这样可以更容易地为所有设备设置内容