再次呈现相同的`GameScene`

时间:2016-06-25 09:20:51

标签: xcode swift sprite-kit

在付费网站的一些教程中,我了解到你可以通过再次呈现相同的场景重播游戏,但我再也无法访问该教程,所以我不确定我做错了什么。如果我没记错的话,教程使用了这样的东西(在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!

第一行和第二行造成致命错误(我认为),但我不确定原因。在再次呈现同一场景之前,我是否应该从场景中删除所有孩子?通过该教程,我们只是在几行中呈现了相同的场景,并且它有效。

更新:

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课程很长,所以我只添加了一些我认为有问题的部分,但不知道为什么或应该改变什么。

1 个答案:

答案 0 :(得分:0)

改变这个:

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
 }