首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何让spritekit游戏在所有iphone机型上看起来都一样

如何让spritekit游戏在所有iphone机型上看起来都一样
EN

Stack Overflow用户
提问于 2015-12-21 08:21:07
回答 3查看 541关注 0票数 0

我目前正在使用iPhone4进行开发,当我在iPhone5上运行时,所有的边缘都在视图之外,就像场景对于视图来说太大了。sprite kit中有没有我遗漏的一些属性,可以自动调整节点的大小,使其在每个iphone机型上的外观和运行方式都相同,或者我是否必须手动执行某些操作,确定正在使用的机型,然后更改每个节点的比例?如果我必须手动完成,那么最好的方法是什么?

EN

回答 3

Stack Overflow用户

发布于 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()中添加此代码,也可以在创建新场景时添加此代码。

代码语言:javascript
运行
复制
let scene = GameScene(size: CGSize(width: 1080, height: 1920))
scene.scaleMode = .AspectFill

2)获取设备值

接下来,我们要计算设备和其他值的比率,因此在scene类中添加以下内容。

代码语言:javascript
运行
复制
let deviceWidth = UIScreen.mainScreen().bounds.width
let deviceHeight = UIScreen.mainScreen().bounds.height
let maxAspectRatio: CGFloat
let playableArea: CGRect

接下来,在覆盖init()函数中添加以下代码。如果您没有这样的代码,则添加以下所有代码。

代码语言:javascript
运行
复制
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()函数中调用该函数。

代码语言:javascript
运行
复制
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使用以下代码。

代码语言:javascript
运行
复制
scoreLabel.position = CGPoint(x: CGRectGetMinX(playableArea), y: CGRectGetMaxY(playableArea)
//You can also use CGRectGetMaxX, CGRectGetMidX, CGRectGetMidY, CGRectGetMinY for your objects.

5)两个设备的截图

请注意添加的对象是如何相对于屏幕视图定位的。

如果您还想为iPad制作游戏,则必须将场景初始化为2048x1536的大小或将其切换为肖像。

票数 2
EN

Stack Overflow用户

发布于 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多一点的数据,但具有相同的比例因子。

票数 1
EN

Stack Overflow用户

发布于 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。

您将使用通用资源插槽和/或特定于设备的图像。这样,您就可以在所有设备上获得一致的体验

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34387442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档