【问题标题】:Changing button image removes skscene更改按钮图像会删除 skscene
【发布时间】:2015-09-14 15:14:18
【问题描述】:

我的项目是作为Spritekit 游戏开始的。 我在情节提要中的defaultviewcontroller 顶部放置了一个按钮。 我已经在viewwilllayoutsubviews中展示了一个场景。

 if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
            // Configure the view.
            let skView = self.view as! SKView
            self.skView = 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 = SKSceneScaleMode.AspectFill
            println("Width: \(scene.frame.width) andHEight: \(scene.frame.height)")
            scene.gameSceneDelegate = self
            sceneStack.append(scene)
            skView.presentScene(scene)
        }

一段时间后,我通过视图控制器代码转换到了一个新场景:

skView.presentScene(scene, transition: transition)

现在场景发生了变化,但我放在视图情节提要上的按钮仍然保留在场景顶部。

在第二个场景中,我像这样更改 UIButton 的图像:

self.lockButton.setImage(UIImage(named: "unlocked-button"), forState: UIControlState.Normal)

现在按下按钮时,我会更改按钮的图像。这令人惊讶地导致场景变回之前的场景。 因此,更改按钮的任何属性都会导致我的新场景弹出并恢复到我最初呈现的场景。

总结: 简而言之,我想要的是一个 UIViewController,它将在我的游戏的每个场景中都有一个通用的 HUD。结果,我不断更改 UIViewController 呈现的场景,保持 UIViewController 不变。但是,当我更改按钮的任何属性时,通过情节提要设置,显示在 SKScene(图像、背景图像、标题等)上,它会导致视图恢复到它显示的初始场景。

【问题讨论】:

  • 如果您粘贴按钮的代码会有所帮助
  • 我的错,问题已被编辑以详细说明。

标签: ios swift sprite-kit


【解决方案1】:

问题是: UIViewController 呈现的初始 SKScene 呈现在viewWillLayoutSubviews 由于更改与我的按钮相关的任何属性,viewWilllayoutSubviews 被调用。 将其更改为仅创建一次初始视图。 一个愚蠢的错误。

【讨论】:

    【解决方案2】:

    如果我理解这一点,您在 Storyboard 中设计了游戏 GUI 菜单,然后您希望在按下按钮时调用 SpriteKit 游戏?

    如果是这种情况,您需要添加新的视图控制器(使用 segue 或只调用 presentViewController 方法)。在该视图控制器中,您可以在 viewDidLoad 或 viewWillLayoutSubviews 方法中设置 SpriteKit。

    因此,当您触发按钮时,按钮会调用这个新的视图控制器(通过 segue 或其他方式),游戏将按应有的方式执行。

    然而,棘手的部分是关闭游戏。如果您只是关闭持有游戏的视图控制器,游戏实际上仍会在后台播放一些东西(在我的情况下,音乐和效果!!!)。 因此,为了退出游戏,您需要在退出关卡\游戏按钮中实现这一点:

    [(NewGameScreenViewController *)self.view.window.rootViewController dismissViewControllerAnimated:YES completion:nil];
    

    抱歉,仅限 Objective-C,讨厌 swift :)

    希望这会有所帮助。

    【讨论】:

    • 无论场景如何,我的 hud 都会保持不变。所以为每个场景制作新的 UIViewController 感觉有点矫枉过正。相反,我认为我可以只保留一个 ViewController 并在不同场景之间进行转换。移动到不同的场景肯定会解决问题,但这似乎不太优雅。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    相关资源
    最近更新 更多