我正在创建我的第一个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。
首先我认为这似乎很好,但看看结果,我发现我做错了。
任何人都可以给我一个提示吗?
提前致谢。
答案 0 :(得分:1)
让我阻止你:)
我理解你的困难,这不是为不同屏幕尺寸构建游戏的正确方法。
你应该只考虑Scene
来构建你的游戏。
然后打开GameViewController.swift
并查找此行
scene.scaleMode = .AspectFill
此行允许您定义场景应如何在屏幕中显示(对于处理不同的屏幕尺寸,这一点尤其重要)。
您有4个选项
.Fill
:缩放SKScene
以填充整个SKView
。.AspectFill
:缩放SKScene
以填充SKView
,同时保留场景的宽高比。如果是,可能会发生一些种植 视图具有不同的宽高比。.AspectFit
:缩放SKScene
以适应SKView
,同时保留场景的宽高比。如果,可能会出现一些信箱 视图具有不同的宽高比。.ResizeFill
:修改SKScene
的实际尺寸,使其与SKView
完全匹配。