xcode - 再次呈现相同的 `GameScene`

标签 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!

第一行和第二行导致 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/

相关文章:

ios swift - 键盘(掩盖文本字段等)和其他一些小部件的问题

swift - 循环遍历场景中的所有对象/ Sprite

ios - SpriteKit 中的插页式广告?

swift - 更改默认的黑色背景颜色

ios - 应用程序在 iPhone 上运行时崩溃,以违规为异常(exception)

ios - 如何在 Swift Xcode 中为所有设备在整个屏幕周围制作边框?

ios - 添加 YahooSDK 后出错

swift - 在 Swift 3 中使用未解析的标识符 'LAContext'

ios - 在 Swift 中将城市名称转换为坐标

ios - swift 4 : Timer Crashing - unrecognized selector sent to instance