在付费网站上的一些教程中,我了解到您可以通过简单地再次呈现相同的场景来重玩游戏,但我无法再访问该教程,所以我不确定我做错了什么。如果我没记错的话,教程使用了类似的内容(在 GameScene 类中):
func newGame() {
let newScene = GameScene()
let transition = SKTransition.fadeWithColor(SKColor.blackColor(), duration: 0.5)
view?.presentScene(newScene, transition: transition)
view?.presentScene(newScene, transition: transition)
}
GameViewController.swift
:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if let skView = self.view as? SKView {
if skView.scene == nil { //if the scene hasn't been created yet
let aspectRatio = skView.bounds.size.height / skView.bounds.size.width
let scene = GameScene(size: CGSize(width: 320, height: 320 * aspectRatio))
//skView.showsFPS = true
//skView.showsNodeCount = true
//skView.showsPhysics = true
skView.ignoresSiblingOrder = true
scene.scaleMode = .AspectFill
skView.presentScene(scene)
}
}
}
问题是这给了我以下错误:
libc++abi.dylib: terminating with uncaught exception of type NSException
如果我添加一些断点,问题似乎出在我的 GameScene
上。这是它的前几行:
class GameScene: SKScene, SKPhysicsContactDelegate {
var player: Player!
var world: SKNode!
第一行和第二行导致 fatal error (我认为),但不确定原因。在再次呈现同一场景之前,我是否应该将所有 child 从场景中移走?通过该教程,我们仅用几行内容呈现了相同的场景,并且它起作用了。
更新:
class GameScene: SKScene, SKPhysicsContactDelegate {
var player: Player!
var world: SKNode!
override func didMoveToView(view: SKView) {
self.physicsWorld.contactDelegate = self
player = Player(position: CGPointMake(size.width*0.5, size.height*0.4))
world.addChild(player)
}
}
因为 GameScene
类相当长,所以我只添加了我认为有问题但不知道为什么或应该更改什么的部分。
最佳答案
更改此:
func newGame() {
let newScene = GameScene()
let transition = SKTransition.fadeWithColor(SKColor.blackColor(), duration: 0.5)
view?.presentScene(newScene, transition: transition)
view?.presentScene(newScene, transition: transition)
}
对此:
func newGame() {
let newScene = GameScene(size: CGSize(width: 768, height: 1024))
let transition = SKTransition.fadeWithColor(SKColor.blackColor(), duration: 0.5)
view?.presentScene(newScene, transition: transition)
view?.presentScene(newScene, transition: transition)
}
另外,对于您的 gameViewController,您不需要使用宽高比来设置 skView 的大小。由于您使用 AspectFill 作为您的scaleMode,场景会自动缩放它。这样,您就可以将屏幕尺寸设置为 768x1024(纵向)或 1024x768(横向)。要使其与所有设备兼容,只需将背景设置为 1024x1024,这样它在 iPad 上看起来就很好,并且您只需执行以下操作即可调整 iPad 的 HUD 元素:
if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
yourButton.position.y += 100
yourLabel.position.y += 100
etc
}
关于xcode - 再次呈现相同的 `GameScene`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38026898/