出于某种原因,我的游戏中正在交换宽度和高度值(如下所示),这些值设置为横向。这样,应该在屏幕中居中的精灵完全偏离正确的位置。
您可以下载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
}
}
}
提前谢谢,
路易斯。
答案 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上,你会在顶部和底部(风景)或左右(人像)有一些额外的空间,你通常只是用更多的背景覆盖并拥有一个不可玩的区域
你的场景现在基本上就是这样。
红色区域是您的整个场景尺寸(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上的东西是屏幕外的。
这没有任何意义,因为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. */
}