【问题标题】:how to detect which scene? (swift/spritekit/xcode)如何检测哪个场景? (迅捷/spritekit/xcode)
【发布时间】:2014-11-27 00:48:47
【问题描述】:

我在游戏视图控制器中使用此代码作为我的背景:

    let yourImage = UIImage(named: welkeLevel)
    let imageview = UIImageView(image: yourImage)
    self.view?.addSubview(imageview)

但是我有一个开始(菜单)场景,我不想要这个背景并且仍然出现。

如何检测我在哪个场景(游戏场景/菜单场景等)?

或者还有其他方法吗?

【问题讨论】:

    标签: xcode swift background scene


    【解决方案1】:

    SKSceneSKNode 的子类。您可以使用 name 属性来执行此操作。只需将GamesceneMenuscene 的名称设置为'game''menu',如下所示:

    scene.name = "game"
    

    然后像这样检查属性:

    if self.name == "game"{
        //Do something.
        println("game")
    } else if self.name == "menu
        //Do something else.
        println("menu")
    }
    

    【讨论】:

    • 我把这段代码放在视图控制器还是游戏场景中?谢谢
    • 因为它说 gameviewcontroller 在这行代码中没有名为“name”的成员: if self.name == "game"{
    • 第一个块应该在您的视图控制器中,第二个在实际游戏场景中。如果您需要在视图控制器中使用第二个块,只需将 self 替换为您要检查的场景的引用即可。
    • 我想在我的视图控制器中使用第二个块,但我不知道您将 self 替换为您要检查的场景的引用是什么意思。我想检查场景是否是一个 GameScene,但是如果我将 self.name 更改为 GameScene.name 它会给出错误
    【解决方案2】:
    I have worked out the same issue with a replay button. I have to identify which scene the user is in and reload the same when user clicks replay button.
    
    1) Add a extension function  to detect current game level
    
    extension SKScene {
    
        static func sceneWithClassNamed(className: String, fileNamed fileName: String) -> SKScene? {
            if let SceneClass = NSClassFromString("JumperCrab.\(className)") as? SKScene.Type,
                let scene = SceneClass(fileNamed: fileName) {
                    return scene
            }
            return nil
        }
    
        func replayCurrentScene(currentLevelName: String,currentGameSceneIndex:Int)
        {
            GameViewController().getReplayCurrentSceneDetailsToVC(currentLevelName, currentGameSceneIndex: currentGameSceneIndex)
        }
    }
    
    2) Call the above extension method in every game scene.
    
        override func didMoveToView(view: SKView) {
            self.replayCurrentScene( "Round 1", currentGameSceneIndex: 0)
    }
    
    3) Set up a similar method at the View Controller.
    
        func getReplayCurrentSceneDetailsToVC(currentLevelName: String,currentGameSceneIndex:Int)
        {
            NSUserDefaults.standardUserDefaults().setInteger(currentGameSceneIndex, forKey: "LevelInt")
            NSUserDefaults.standardUserDefaults().synchronize()
    
            NSUserDefaults.standardUserDefaults().setObject(currentLevelName, forKey: "LevelName")
            NSUserDefaults.standardUserDefaults().synchronize()
    
        }
    
    4)  Create variables 
    
        //GAME LEVEL
        var gameLevelSceneNameArray = NSArray()
        var currentGameSceneAtVC:String?
        var currentGameSceneIndexAtVC:Int?
    
    5) Make my level list array
    
      override func viewDidLoad() {
            super.viewDidLoad()
    
            //Game Scenes
            gameLevelSceneNameArray = ["GameScene","SecondRound","ThirdRound", "FourthRound","FifthRound","SixthRound","SeventhRound", "EighthRound","NinethRound"]
    }
    
    6) Apply on the Replay Game button .
    
        @IBAction func replayButtonClicked(sender: AnyObject) {
    
        currentGameSceneIndexAtVC =   NSUserDefaults.standardUserDefaults().integerForKey("LevelInt")
        currentGameSceneAtVC = NSUserDefaults.standardUserDefaults().objectForKey("LevelName") as? String
    
     self.moveToSelectedGameLevel(currentGameSceneAtVC!, gameSceneName: self.gameLevelSceneNameArray[currentGameSceneIndexAtVC!] as! String)
    
        }
    
    7) Set up a game scene navigation too (using switch case )
    
    
    func moveToSelectedGameLevel(levelNameString:String, gameSceneName:String)
        {
            let skView = self.view as! SKView
            switch(levelNameString)
            {
            case "Round 1":
                if let gameScene = SKScene.sceneWithClassNamed(gameSceneName, fileNamed: gameSceneName) {
                    skView.presentScene(gameScene)
                }
            case "Round 2" :
                if let gameScene = SKScene.sceneWithClassNamed(gameSceneName, fileNamed: gameSceneName) {
                    skView.presentScene(gameScene)
                }
            case "Round 3":
                if let gameScene = SKScene.sceneWithClassNamed(gameSceneName, fileNamed: gameSceneName) {
                    skView.presentScene(gameScene)
            default:
                print("")
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多