交换宽度和高度值

时间:2016-09-10 21:36:26

标签: ios swift sprite-kit

说明

出于某种原因,我的游戏中正在交换宽度和高度值(如下所示),这些值设置为横向。这样,应该在屏幕中居中的精灵完全偏离正确的位置。

enter image description here

代码

您可以下载here

GameScene

import SpriteKit

class GameScene: SKScene {

    override func didMoveToView(view: SKView) {

        print("width:", self.frame.width)
        print("height:", self.frame.height)

        //Sprite
        let sprite = SKSpriteNode (imageNamed: "sprite")
        sprite.anchorPoint = CGPointZero
        sprite.position = CGPoint(x: self.frame.width / 2 - sprite.frame.width / 2, y: self.frame.height / 2 - sprite.frame.height / 2)
        addChild(sprite)
    }
}

GameViewController

import UIKit
import SpriteKit

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set view size.
        let scene = GameScene(size: view.bounds.size)

        // Configure the view.
        let skView = view as! SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true

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

        skView.presentScene(scene)
    }

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
            return .Landscape
        } else {
            return .Landscape
        }
    }
}


提前谢谢,
路易斯。

3 个答案:

答案 0 :(得分:1)

如果你去xCode项目中的targets-General(你设置了版本号,包ID等),你是否取消了肖像?您还可能需要检查info.plist以查看是否已删除两个设备的所有纵向条目。

不幸的是,你接近很多教程教你的不好的做法,我不会继续这样做。

如果您使用“scaleMode ResizeFill”或将场景大小设置为“view.bounds”,您的游戏将永远不会在所有设备上保持一致。此外,所有值(精灵大小,字体大小,物理值等)在与您正在测试的设备不同的设备上也不会相同。

基本上你必须像5-6设备一样调整所有这些以及它的疯狂,特别是使用xCode模拟器。相信我,我曾经在那里参加了2场比赛而且几乎杀了我。它是一场游戏“是的,这看起来是对的”。

不要经历这个,所以你应该做的是

1)将场景大小更改为xCode

使用的默认场景大小
  GameScene(size: CGSize(width: 1024, height: 768)) // swap if portrait

注意:检查底部的更新

  If you dont do this, and leave it at view.bounds.size, point 2 will not work.

2)将场景比例模式更改为.AspectFill(也是默认的xCode设置)。

这样所有的东西在所有iPhone上看起来都很棒。您的值将正确缩放,您可以节省大量的工作。 在iPad上,你会在顶部和底部(风景)或左右(人像)有一些额外的空间,你通常只是用更多的背景覆盖并拥有一个不可玩的区域

你的场景现在基本上就是这样。

enter image description here

红色区域是您的整个场景尺寸(iPad),但如果您在iPhone上运行,您将只看到绿色位。在纵向模式下,红色区域位于左侧和右侧。

这就是为什么y定位通常是从中心完成的,因为如果你使用frame.minY或frame.maxY,你将处于红色区域,并且不会在iPhone上看到精灵。您只需要覆盖更多背景的红色区域(您的背景全屏图像应该是iPad大小)。

这也使你的游戏更加平衡,因为如果你的游戏比iPad更容易,那么因为你有更多的空间。

因此,在绿色区域内设计您的游戏。在iPad上,你可能要做的唯一事情就是在你想要在顶部边缘显示时,移动一些UI,如暂停按钮或分数标签。我是这样做的。

 // Some button
 ...
 someButton.position = CGPoint(x: frame.midX, y: frame.midY + 200)
 addChild(someButton)

 if UIDevice.current.userInterfaceIdiom == .pad {
     // set for iPad
 }

 // Some label
 someLabel.positon = CGPoint(x: frame.midX - 100, someButton.position.y) // because its y position is the same as someButton I only have to adjust someButton.position.y on iPads.
 addChild(someLabel)

我不会继续你的方法,即使这意味着要重做很多工作。

更新:

似乎xCode 8 apple将默认场景大小从1024x768(768x1024)更改为1334x750(750x1334)。我只是玩了一些这些设置,他们似乎对通用游戏感到困惑。

所以你的场景现在看起来像这样,iPad上的xAxis上的东西是屏幕外的。

enter image description here

这没有任何意义,因为iPad显然不比iPhone更宽屏。 我实际上打开了一个错误报告,看看苹果对此有什么说法,所以现在我可能会把它保持在1024x768。

希望这有帮助

答案 1 :(得分:0)

覆盖viewWillLayoutSubviews中的GameViewController,以确保获得正确的视图宽度/高度。这也意味着您可以实例化的任何对象都需要等到调用此方法。

所以你想要做类似

的事情
class GameViewController: UIViewController {

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    // NOTE: Add code to do this only once!
    // Set view size.
    let scene = GameScene(size: view.bounds.size)

    // Configure the view.
    let skView = view as! SKView
    skView.showsFPS = true
    skView.showsNodeCount = true

    /* Sprite Kit applies additional optimizations to improve rendering performance */
    skView.ignoresSiblingOrder = true

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

    skView.presentScene(scene)
}

注意我没有尝试编译它,它缺少尾随}。此外,您只想这样做一次,我还没有添加代码来做到这一点。在我的游戏中,我的场景是一个属性,所以我只是检查它是否为零,如果是,那么我创建场景并呈现。

答案 2 :(得分:0)

根据您的代码并根据您希望如何在GameScene中构建精灵和位置,您只需将scene.scaleMode更改为 AspectFill AspectFit < / em>(取决于你想要达到的目标):

<强>来源

@available(iOS 7.0, *)
public enum SKSceneScaleMode : Int {

    case Fill /* Scale the SKScene to fill the entire SKView. */
    case AspectFill /* Scale the SKScene to fill the SKView while preserving the scene's aspect ratio. Some cropping may occur if the view has a different aspect ratio. */
    case AspectFit /* Scale the SKScene to fit within the SKView while preserving the scene's aspect ratio. Some letterboxing may occur if the view has a different aspect ratio. */
    case ResizeFill /* Modify the SKScene's actual size to exactly match the SKView. */
}