【问题标题】:How to exactly measure size & position of Swift nodes depending on iDevice如何根据 iDevice 准确测量 Swift 节点的大小和位置
【发布时间】:2016-07-27 20:44:34
【问题描述】:

我正在创建我的第一个 Swift + SpriteKit 游戏,并且我正在处理必须根据 iDevice 调整我所有东西的大小的问题。

我有一个类,它基于它运行的设备,返回它的名称。 有了这个名称,我创建了一个基于设备字符串名称的字典,返回给定设备的分辨率。

然后我创建了 2 个函数 -> getSizeBasedOnDevice() 和 getPositionBasedOnDevice()

自从我为 iPhone 6S 编写了我的游戏。我以为只要做一个简单的数学计算就可以得到所有这些尺寸和位置,但看起来并非如此。

这些是我的功能:

func getSizeBasedOnDevice(width: CGFloat, height: CGFloat) -> CGSize {
    // iPhone 6s w: 375, h: 667

    let deviceName = UIDevice.currentDevice().modelName
    let iphoneNative = ScreenSize(width: 375, height: 667)
    let resolution = Resolutions[deviceName]

    let newWidth = (CGFloat(resolution!.getWidth()) * width ) / iphoneNative.getWidth()
    let newHeight = (CGFloat(resolution!.getHeight()) * height) / iphoneNative.getHeight()

    return CGSize(width: newWidth, height: newHeight)
}

func getPositionBasedOnDevice(x: CGFloat, y: CGFloat) -> CGPoint {

    let deviceName = UIDevice.currentDevice().modelName
    let iphoneNative = ScreenSize(width: 375, height: 667)
    let resolution = Resolutions[deviceName]

    let newX = (CGFloat(resolution!.getWidth()) * x) / iphoneNative.getWidth()
    let newY = (CGFloat(resolution!.getHeight()) * y) / iphoneNative.getHeight()

    return CGPoint(x: newX, y: newY)
}

我的 iPhoneNative 高度和宽度将是我的 iPhone 6S'。 所以计算对我来说有点简单,但事实并非如此。

所以有这些示例值:

Asset's width = 100 pts
Current Device (iPhone 4S) width = 320 pts
Originally designed Device (iPhone 6S) width = 375 pts

数学是:

(320 * 100) / 375 = 85.33

因此,在我的 iPhone 6S 上宽度为 100 磅的资产在 iPhone 4S 上的宽度为 85.33。

起初我认为这似乎很好,但看看结果,我发现我做错了。

谁能给我一个提示?

提前致谢。

【问题讨论】:

    标签: ios iphone swift sprite-kit resolution


    【解决方案1】:

    让我阻止你:)

    我理解您的困难,这不是为不同屏幕尺寸构建游戏的正确方法。

    您应该只考虑Scene 来构建您的游戏。

    然后打开GameViewController.swift并寻找这一行

    scene.scaleMode = .AspectFill
    

    这一行确实允许您定义场景应如何呈现到屏幕中(这对于处理不同的屏幕尺寸尤为重要)。

    你有 4 个选项

    • .Fill:缩放SKScene 以填充整个SKView
    • .AspectFill:缩放SKScene 以填充SKView,同时保持场景的纵横比。一些裁剪可能会发生,如果 视图具有不同的纵横比。
    • .AspectFit:缩放SKScene 以适应SKView,同时保持场景的纵横比。一些信箱可能会发生,如果 视图具有不同的纵横比。
    • .ResizeFill:修改SKScene的实际大小,使其与SKView完全匹配。

    【讨论】:

    • 感谢您的回复 :) 我试过了.. 设置不同的 scaleModes... 我目前有 .AspectFill,但测试了几乎所有...而且我一直看到相同的结果.. 你呢知道为什么会这样吗?
    • @msqar: .AspectFill 可以剪切场景的某些部分,但会填满屏幕。这就像在旧的 3/4 电视上观看宽屏电影,其中边栏被裁剪(或者在启用缩放的现代宽屏上观看 3/4 旧的星际迷航电视剧集:顶部和底部栏被裁剪)。您在寻找什么样的代表?您要解决的问题是什么?
    • 首先,以主菜单为例,我有几个带有特定动画的按钮,3 个用于竞争、练习和选项的按钮,然后是用于不同事物的迷你按钮,包括 facebook 和 twitter 帐户。让你想象一下我所看到的……我可以看到所有东西都和我的 iPhone 6S 一样大小,但分辨率是 4S ……你可以想象一切都是多么混乱,我什至看不到选项下方的小按钮按钮,因为我的广告横幅位于底部。
    • @msqar:我明白,.AspectFill 听起来是正确的选择。它应该在更大的屏幕上缩放你的场景......你确定你真的设置了.AspectFill
    • 问题是,我开始为 iPhone 6S 编写代码,并试图让它适合更小的屏幕,反之亦然……这就是问题所在。如果反过来的话,也许就没有问题了。是的,现在正在使用 .AspectFill :(
    猜你喜欢
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多