我目前正在使用iPhone4进行开发,当我在iPhone5上运行时,所有的边缘都在视图之外,就像场景对于视图来说太大了。sprite kit中有没有我遗漏的一些属性,可以自动调整节点的大小,使其在每个iphone机型上的外观和运行方式都相同,或者我是否必须手动执行某些操作,确定正在使用的机型,然后更改每个节点的比例?如果我必须手动完成,那么最好的方法是什么?
发布于 2015-12-21 16:51:26
下面是如何让你的游戏在所有iPhone/iPod机型上运行,从4S到6S Plus的纵向模式(对于横向模式,请参阅注释代码)。我已经在我的游戏Chomp'd中使用了这种技术,它适用于所有设备。请注意,您可能必须编辑您的游戏以适应此代码。如果你需要更多帮助,这里有我制作的GitHub Tutorial的链接。
下面是代码将做的事情。代码将计算出设备的比例,然后它将计算用户可查看的屏幕区域,并创建一个该大小的矩形,而不管设备的大小。然后,您可以使用此矩形来定位您的对象、菜单项、HUD等。
1)初始化场景
1920年前,iPhone的最大尺寸为1080 (iPhone 6+纵向)。当我们创建一个scene对象时,将其初始化为这样的大小(将其切换为横向),并将缩放模式设置为宽高比填充(这意味着到1920年背景必须至少为1080;对于较小的设备,背景可能会被切断)。可以在ViewController.swift文件的viewDidLoad()中添加此代码,也可以在创建新场景时添加此代码。
let scene = GameScene(size: CGSize(width: 1080, height: 1920))
scene.scaleMode = .AspectFill
2)获取设备值
接下来,我们要计算设备和其他值的比率,因此在scene类中添加以下内容。
let deviceWidth = UIScreen.mainScreen().bounds.width
let deviceHeight = UIScreen.mainScreen().bounds.height
let maxAspectRatio: CGFloat
let playableArea: CGRect
接下来,在覆盖init()函数中添加以下代码。如果您没有这样的代码,则添加以下所有代码。
override init(size: CGSize) {
//Initializes the maxAspectRatio variable
maxAspectRatio = deviceHeight / deviceWidth
//USE THIS CODE IF YOUR APP IS IN PORTRAIT MODE
let playableWidth = size.height / maxAspectRatio
let playableMargin = (size.width - playableWidth) / 2.0
playableArea = CGRect(x: playableMargin, y: 0, width: playableWidth, height: size.height)
/*USE THIS CODE IF YOUR APP IS IN LANDSCAPE MODE
let playableHeight = size.width / maxAspectRatio
let playableMargin = (size.height - playableHeight) / 2.0
playableArea = CGRect(x: 0, y: playableMargin, width: size.width, height: playableHeight)
*/
super.init(size: size)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
3)创建View的矩形
在scene类的任意位置添加以下函数。然后,在覆盖didMoveToView()函数中调用该函数。
func drawPlayableArea() {
let shape = SKShapeNode()
let path = CGPathCreateMutable()
CGPathAddRect(path, nil, playableArea)
shape.path = path
shape.strokeColor = SKColor.redColor()
shape.lineWidth = 8
addChild(shape)
}
override func didMoveToView(view: SKView) {
drawPlayableArea()
}
如果一切都做对了,那么无论是iPhone 4S还是iPhone 6 Plus,你都应该能够在设备的可视区域周围看到一个红色的矩形。
4)使用矩形定位对象
现在您有了一个屏幕大小的对象,您可以相对于矩形定位对象,例如,要将对象定位在左上角,您可以对playableArea使用以下代码。
scoreLabel.position = CGPoint(x: CGRectGetMinX(playableArea), y: CGRectGetMaxY(playableArea)
//You can also use CGRectGetMaxX, CGRectGetMidX, CGRectGetMidY, CGRectGetMinY for your objects.
5)两个设备的截图
请注意添加的对象是如何相对于屏幕视图定位的。
如果您还想为iPad制作游戏,则必须将场景初始化为2048x1536的大小或将其切换为肖像。
发布于 2015-12-21 22:12:32
在处理场景时,您几乎有4个选项:
这可以使用scene.scaleMode
进行更改
Aspect Fit:这将适合您的内容,直到填满最小的屏幕空间。也就是说,如果你是在纵向模式,它将填充到两侧,并留下黑色的顶部和底部。
Aspect Fill:这将适合你的内容,直到你最大的屏幕空间被填满。也就是说,如果你处于纵向模式,它会填满顶部和底部,并且你的侧面会被砍掉。
填充:这将在两个方向上缩放内容,而不会保留场景的纵横比。
调整填充大小:不涉及任何缩放,而是将场景大小调整为视图的大小
在你的例子中,最好的答案是Aspect Fill,这当然会砍掉左边和右边的数据,所以当你设计的时候,不要把任何重要的东西放在这些区域中。这也允许你使用一组较小的纹理,并允许你放大,利用硬件抗锯齿,而不是Jozemite应用程序答案,这是使所有的gfx超级大,然后缩小他们为设备。根据你的图形风格,一种方式在视觉上会比另一种方式更吸引人。
更多的个人喜好。我知道你说你正在为iPhone 4编程,但是如果你正在设计一个纯iPhone的游戏,我建议你设计一个16:9格式的场景,场景大小为568x320,然后通过简单地检查屏幕尺寸来检查你使用的是哪种设备。如果你的身高在纵向模式下是480,那么你知道它是4(或4s),所以你将填充设置为.ResizeFill,并将场景上移44px,并将其他设备设置为纵横比。这将允许图形丢失发生在顶部和底部,而不是侧面,这可能是您想要的。基本上,5可以看到比4多一点的数据,但具有相同的比例因子。
发布于 2015-12-26 02:24:59
我们在SpriteKt中通常做的是给SKScene一个固定的大小,让SpriteKit在不同的设备上为你做缩放。
因此,基本上我们有两种方法来正确地完成它
1)场景大小设置为纵向(如1024x768 -landscape,768x1024 - iPad )。这是Xcode7中的默认设置。
你通常只是在iPhones上裁剪的iPads的顶部/底部(横向)或左侧/右侧(纵向)显示一些额外的背景。
在iPhones上显示更多iPads / crop的游戏示例:
阿尔托斯冒险,狮子座财富,边缘,线禅宗,现代战斗5。
2)苹果公司将xCode 8中的默认场景尺寸更改为iPhone 6/7 (750*1334-波尔泰,1337*750-横向)。此设置将在iPads上裁剪您的游戏。
在iPads上显示较少的游戏示例:
卢米诺市,机器人独角兽攻击
在这两个选项之间的选择取决于你,并取决于你制作的是什么游戏。我通常更喜欢使用选项1,并在iPads上显示更多的背景。
无论场景大小如何,缩放模式通常最好保留默认设置.aspectFill。
您将使用通用资源插槽和/或特定于设备的图像。这样,您就可以在所有设备上获得一致的体验
希望这能有所帮助
https://stackoverflow.com/questions/34387442
复制相似问题