2016-07-27 57 views
2

我正在创建我的第一个Swift + SpriteKit游戏,我正在处理这个头痛的问题,因为我不得不根据iDevice来调整所有的东西。如何根据iDevice准确测量Swift节点的大小和位置

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

然后,我创建了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

使有100资产我的iPhone 6S上的点宽度在iPhone 4S上的宽度为85.33。

首先,我认为这似乎很好,但看着结果,我看到我做错了。

任何人都可以给我一个提示吗?

在此先感谢。

回答

1

让我阻止你:)

我理解你的困难,这是不以建立不同的屏幕尺寸游戏的正确途径。

你应该建立你的游戏只考虑Scene

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

scene.scaleMode = .AspectFill 

此行确实允许您定义的场景应该如何代表到屏幕(这对不同屏幕尺寸的处理尤为重要)。

你有4个选项

  • .Fill:缩放SKScene填满整个SKView
  • .AspectFill:缩放SKScene以填充SKView,同时保留场景的高宽比。如果视图具有不同的纵横比,则可能会发生一些裁剪。
  • .AspectFit:缩放SKScene以适应SKView内,同时保留场景的纵横比。如果 视图具有不同的纵横比,则可能会发生一些信箱操作。
  • .ResizeFill:修改SKScene的实际尺寸完全匹配SKView
+0

感谢回答:)我试过..设置不同scaleModes ......我现在有.AspectFill,但对它们进行测试的几乎所有...我不断看到同样的结果..你知道为什么会发生? – msqar

+0

@msqar:'.AspectFill'可以剪切场景的某些部分,但会填满屏幕。这就像看宽屏电影到旧的3/4电视上,侧边栏被裁剪(或者在启用缩放功能的现代宽屏上观看3/4年的“星际迷航”电视剧集:顶部和底部的条块被裁剪掉)。你在找什么样的代表?你试图解决什么问题? –

+0

要开始,主菜单例如,我有几个按钮与某些动画,3个按钮的竞争,实践和选择,然后迷你按钮,不同的东西,包括Facebook和Twitter帐户。对于你想知道即时消息的内容......我可以看到,所有东西都和我的iPhone 6S一样大小,但是分辨率为4S ..你可以想象如何搞乱一切,我什至不能看到选项下面的小按钮由于我的广告横幅在底部。 – msqar