如何在我的精灵套件游戏 Swift 中为所有 iPhone 获得相同的布局尺寸

Posted

技术标签:

【中文标题】如何在我的精灵套件游戏 Swift 中为所有 iPhone 获得相同的布局尺寸【英文标题】:How to get the same layout dimensions for all iPhones in my sprite kit game Swift 【发布时间】:2015-09-23 00:16:29 【问题描述】:

这是为我的游戏设置布局的代码问题是当我的游戏在较小版本的手机上玩时布局会改变我如何保持相同的尺寸 代码:

 override func viewWillLayoutSubviews() 
    super.viewWillLayoutSubviews()
    if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene 
        let sKView = self.view! as! SKView
        sKView.ignoresSiblingOrder = true
        scene.size = sKView.bounds.size
        let reveal = SKTransition.fadeWithDuration(0.45)
        sKView.presentScene(scene, transition: reveal)



  


上面的代码不能很好地工作,但仅适用于 iPhone 6 plus,这是我正在测试我的应用程序的 iPhone,但在较小的 iPhone 上它不会改变尺寸。

【问题讨论】:

【参考方案1】:

我知道的唯一方法是根据屏幕大小手动调整和移动节点,例如:

if size.width == 320 && size.height == 568 
//iPhone 5/5S screen dimensions
spriteNode!.size = CGSize(height: 30, width: 45)
spriteNode!.position = CGPoint(x: 100, y: 50)
 else if size.width == 768 && size.height == 1024 
//iPad screen dimensions
spriteNode!.size = CGSize(height: 60, width: 90) /* Twice the normal size */
spriteNode!.position = CGPoint(x: 200, y: 80) /* Moved over and above a bit */

这让人头疼,但 AFAIK 是调整节点大小以适应不同屏幕尺寸的最简单方法。

【讨论】:

为什么不使用UIScreen.mainScreen().bounds 来检测屏幕尺寸。使用比率设置 spriteNode 约束。 谢谢,但是代码比率是什么样的,我只需输入 UIScreen.mainScreen【参考方案2】:

我通常这样做的方式如下:创建场景时,我会根据设备将大小设置为特定的默认值;例如:仅用于横向模式(尺寸仅为示例):

    let size =
    UIDevice.currentDevice().userInterfaceIdiom == .Pad ?
        CGSizeMake(3200, 2400) : // all ipads, 4:3 ratio
        UIScreen.mainScreen().bounds.landscapeSize().width < 568 ?
            CGSizeMake(2400, 1600) : // iphone 4s rows; 3:2 ratio
            CGSizeMake(2850, 1600) // other iphones 16:9 ratio

这让我可以在任何设备上知道场景的大小。

为了布局 UI 元素,我使用场景大小并使用偏移量,因此左上角的按钮将具有坐标 (0, scene.height)(对于锚定到 (0,1) 的精灵),并且该按钮将始终出现在顶部任何设备中任何场景的左侧。

通常最好在场景中有一个节点层次结构

场景 背景节点:SKNode,zPosition = 0 世界节点:SKNode,zPosition = 10 HudNode:SKNode,zPosition = 20

这将允许您放大/缩小世界节点(包含游戏元素),同时保持 HUD 节点中的 UI 元素(按钮)的大小固定。

要放大/缩小,您可以直接修改 worldNode 比例,例如 scene.worldNode.setScale(scaleAmount)。 (假设你没有使用 SKCameraNode)

此方案将允许您不必为每个设备定位/调整单独的精灵;相反,更改是在根级别完成的 - 在本例中是 worldNode,并且还允许您拥有根据设备或多或少适当缩放的 UI 元素,并保持固定独立于您的 worldNode 规模。

【讨论】:

以上是关于如何在我的精灵套件游戏 Swift 中为所有 iPhone 获得相同的布局尺寸的主要内容,如果未能解决你的问题,请参考以下文章

使用精灵套件游戏覆盖功能

我小时候在我的玩家类中为我的玩家制作了一个碰撞箱精灵。如何在游戏场景的 didBegin 方法中访问该碰撞箱精灵?

在我的 swift SpriteKit 游戏中,物理体的轮廓通过所有其他节点显示

精灵套件目标 c 中的停止按钮

如何在 swift 和精灵套件中使用精灵表?

如何在精灵套件中旋转精灵节点?