【问题标题】:Display a new GameOver view controller from storyboard when collision is detected检测到碰撞时从情节提要中显示新的 GameOver 视图控制器
【发布时间】:2015-02-09 12:07:29
【问题描述】:

我正在慢慢制作我的第一个 iOS 游戏,但遇到了问题。我试图让我的游戏进入一个“游戏结束”屏幕,这是我使用情节提要中的视图控制器和标签制作的(以及我的其他两个视图控制器,一个用于开始屏幕,一个用于当前游戏)。

这是我在检测到碰撞时调用的碰撞函数。评论是我想做的。

func collision(Bee:SKSpriteNode, Player:SKSpriteNode) {
println("GAME OVER")
println(leftOrRight)
// Call game over view controller from storyboard
}

谁能帮我做这件事?或者,如果这是实现屏幕游戏的错误方法,请指出正确的方向? :)

谢谢。

【问题讨论】:

  • 您是否从 gameviewcontroller 到 gameovercontroller 进行了 segue?
  • 不,我不确定这到底是什么意思。我已经在网上寻找要遵循的指南,但没有成功
  • 你是如何从开始屏幕移动到游戏视图控制器的?
  • 阅读两篇关于使用故事板的教程raywenderlich.com/50308/storyboards-tutorial-in-ios-7-part-1

标签: ios objective-c swift sprite-kit


【解决方案1】:

在 GameScene 中创建一个名为 gameViewController 的弱属性。

weak var gameViewController : GameViewController? = nil

然后在 GameViewController viewDidLoad 中呈现场景之前分配属性。

override func viewDidLoad() {
    super.viewDidLoad()

    let scene = GameScene(size:CGSizeMake(self.view.frame.width, self.view.frame.height))

    scene.gameViewController = self
    skView.presentScene(scene)
}

使用从GameViewController 到GameOverViewController 的唯一名称创建一个segue。然后在collision 函数内部。

func collision(Bee:SKSpriteNode, Player:SKSpriteNode) {
    println("GAME OVER")
    println(leftOrRight)
    self.gameViewController?.performSegueWithIdentifier("goToGameOverController",
        sender: self)
}

【讨论】:

    【解决方案2】:

    我认为您应该创建 GameOver 场景并呈现该场景,而不是执行 segue 以显示另一个视图控制器。

    func collision(Bee:SKSpriteNode, Player:SKSpriteNode) {
    println("GAME OVER")
    println(leftOrRight)
    
    //create GameOverScene here, then present it
    let mainSKView = self.view as SKView!
    let gameOverScene: GameOverScene = GameOverScene()
    
    mainSKView.presentScene(gameOverScene)
    }
    
    • 编辑

    您可以按照以下步骤测试此解决方案的工作:

    1. 创建一个 SpriteKit 场景文件(.sks 文件),只是为了测试,所以这次你不需要在那个场景中绘制任何东西

    2. 创建一个名为GameOverScene的SKScene的子类,再次让类为空,只是为了测试,像这样

    import SpriteKit class GameOverScene: SKScene {}

    1. 在 Collision 函数中像这样调用 gameoverScene:

    let mainSKView = self.view as SKView! let gameOverScene: GameOverScene! = GameOverScene(fileNamed: "GameOverScene") mainSKView.presentScene(gameOverScene)

    如果它不起作用,请告诉我。抱歉,答案格式错误,我无法将整个代码插入一个块中,我不知道为什么。我太傻了。

    【讨论】:

    • 这种解决方案是我的意图,也是我之前尝试过的,但是使用这段代码,我得到一个“使用未声明的类型“GameOverScene”。我该如何解决这个问题?
    • 你从哪里得到这个错误?在 GameOverScene 类或函数碰撞(...)中。您必须创建一个 SKScene 子类(GameOverScene 类:SKScene)并绘制相应的 .sks 文件。在碰撞函数上,您可以通过 unarchiveFromFile 函数创建 GameOverScene 的实例(这也是您从 ViewController 创建和调用 GameScene 的方式)
    • 我刚刚在 main.storyboard 中新建了一个 View Controller。我想将它链接到我制作的那个视图控制器。
    • 我已经编辑了我的答案,请查看并告诉我它是否适合您
    • 感谢您的帮助,这是有道理的,但它让我觉得这个错误 '2015-02-10 09:13:55.426 TestGame[777:7326044] -[SKEmitterNode _didMoveToView:]: unrecognized selector sent到实例 0x7ff2c9306f80 2015-02-10 09:13:55.428 TestGame[777:7326044] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[SKEmitterNode _didMoveToView:]:无法识别的选择器发送到实例 0x7ff2c9306f80'
    猜你喜欢
    • 2011-12-20
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多