Search code examples
iosswiftsprite-kitgame-centergame-center-leaderboard

In spritekit I cant pop GameCenter view


I am making a game with sprite kit , and all went fine before I use GameCenter inside , Here is my code

define the Gameviewcontroller:

var GameController:GameViewController = GameViewController()

When you touch the node inside the TouchecBegan :

    let touchLocation = (touches as NSSet).anyObject()?.locationInNode(self)

    let targetNode = self.nodeAtPoint(touchLocation!)

    if targetNode.name == "leader"{

        print("hhhh")

        GameController.showGamecenetr()

    }

and inside the GameViewController the code of ShowGameCenter:

func showGamecenetr() {

    print("jijijijji")

    GameKitHelper.sharedInstance.showGKGameCenterViewController(self)

}

It should pop the view of GameCenter , but it shows the error:

could not cast value of type UIView to SubView

I found that it is a very easy error , but I never met it here before , I don't know how to handle it ,Can anybody help me ?

Here are the code that inside showGKGameCenterViewController()

func showGKGameCenterViewController(viewController:UIViewController!){

    if !gamecenterEnable {

        print("No user!")
        return 
        }

    let gameCenterViewController = GKGameCenterViewController()

    gameCenterViewController.gameCenterDelegate = self

    gameCenterViewController.viewState = .Leaderboards
    viewController.presentViewController(gameCenterViewController, animated: true, completion: nil)

    }

help help ;(


Solution

  • So i assume you authenticated your local player/user. To open GameCenter just do it like this in your scene

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    
        for touch in touches {
            let location = touch.locationInNode(self)
            let touchedNode = nodeAtPoint(location)
    
            if targetNode.name == "leader"{
                let gcViewController: GKGameCenterViewController = GKGameCenterViewController()
                gcViewController.gameCenterDelegate = self
    
                gcViewController.leaderboardIdentifier = kLeaderboardID
    
                gcViewController.viewState = GKGameCenterViewControllerState.Leaderboards
                let vc: UIViewController = self.view!.window!.rootViewController!
                vc.presentViewController(gcViewController, animated: true, completion: nil)  
            }
        }
    }
    

    GKGameCenterControlleDelegate in your scene

    class GameScene: SKScene, GKGameCenterControllerDelegate {
    

    And

    func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController) {
    
        AppDelegate().resumeBackgroundMusic()
        gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)
    }