使用SpriteKit调整iPhone X的屏幕大小

4
因为 iPhone X 的屏幕不同于其他设备,所以有很多人在 Stack Overflow 上发了关于如何适配 SpriteKit 场景的问题。但是我找不到任何一个与我问题相同的帖子。
是否有任何方法可以为 iPhone X 调整屏幕大小?或者我必须创建一个只针对 iPhone X 的场景才能适应屏幕?
使用 `.aspectFit`,我得到的效果如下图所示: enter image description here 我想将这个场景延伸到刘海下面和屏幕角落上方。我看到很多游戏都完美适配,但我还没有找到合适的解决方案。
注意:我不能使用 `aspectFill`,因为游戏中的某些部分会超出视野。
非常感谢任何链接或答案!
编辑后:
`resizeFill` 太大了,一切都被放大了。
我尝试了四种屏幕大小的选项,但没有一个能够解决问题。有人有建议吗?
我感觉解决方案需要具体问题具体分析,因为它将需要相对于那些边界来调整屏幕大小。

听起来你应该使用resizeFill - Craig Siemens
@CleverError 这会使它变得太大了 - 我所有的精灵都偏离了屏幕或被放大了。 - George
您需要更改您的安全区域。 - Knight0fDragon
1
此外,我认为您不理解aspectFill的重点。不同的设备具有不同的宽高比,因此您将不得不在某个地方裁剪游戏图形,否则就会使用.fill进入肥胖模式。Aspect Fit意味着对于不符合您设计的宽高比的游戏,您会看到黑色边框。Aspect Fill意味着会进行裁剪。Fill意味着忽略宽高比并尽可能拉伸图形以填充所有4个角落,而调整大小则会调整您的游戏大小以匹配屏幕上的点数,因此在plus设备上可以看到更多的游戏世界,而在SE上则不行。 - Knight0fDragon
1
我强烈建议始终在正方形场景中设计,并针对不同设备更改您的HUD,但如果您只打算制作手机游戏,则应将场景设计为39x18,额外空间可用于视觉效果,以便在裁剪为16x9时,只会裁剪掉多余的部分。 - Knight0fDragon
2个回答

0
我们(我和snapbackdev)找到了一个解决方案,适用于现在或未来的任何手机,可以将屏幕设置为适合整个视图,而不会拉伸或留空白处。
我们最终采用了编程方式完成所有操作,这使得一切都能正常工作。
GameViewController.swift中,此代码加载GameScene
override func viewDidLoad() {
    super.viewDidLoad()

    if let view = self.view as! SKView? {

        // Load a GameScene with the size of the view
        let scene = GameScene(size: view.frame.size)

        // Set the scale mode to scale to fit the window
        scene.scaleMode = .aspectFill

        // Present the scene
        view.presentScene(scene)


        view.ignoresSiblingOrder = true
        view.showsFPS = true
        view.showsNodeCount = true

    }
}

这也可以在viewDidLayoutSubviews中完成,具体取决于您的操作。

GameScene.swift中设置场景所需的唯一代码是:

override func didMove(to view: SKView) {

    // Set (0, 0) as the centre of the screen
    scene?.anchorPoint = CGPoint(x: 0.5, y: 0.5)

    // Create the frame
    let frameEdge = SKPhysicsBody(edgeLoopFrom: frame)
    self.physicsBody = frameEdge

}

0
将以下代码添加到您的程序中,它将为iPhone X和普通iPhone设置可播放游戏区域,然后使用gameArea常量来定义物体可以移动的距离。
//MARK: Playable Game Araa
let gameArea: CGRect

override init(size: CGSize) {
    if UIDevice().userInterfaceIdiom == .phone && UIScreen.main.nativeBounds.height == 2436 {
        //iPhone X
        let maxAspectRatio: CGFloat = 19.5/9.0
        let playableWidth = size.height / maxAspectRatio
        let margin = (size.width - playableWidth) / 2
        gameArea = CGRect(x: margin, y: 0, width: playableWidth, height: size.height)
    } else {
        let maxAspectRatio: CGFloat = 16.0/9.0
        let playableWidth = size.height / maxAspectRatio
        let margin = (size.width - playableWidth) / 2
        gameArea = CGRect(x: margin, y: 0, width: playableWidth, height: size.height)
    }

    super.init(size: size)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接