iOS游戏开发之Game Center实战

tags:开发随笔

Game Center概述

GameCtr_aware_GameFlow_2x.png

在App Store中,最流行的应用类型非游戏莫属。几乎所有的iOS用户都下载并玩过游戏。有各种样的游戏玩家,有人为之痴狂,有人只是偶尔玩玩。不过无论是哪种玩家,都会注重游戏的趣味性。在游戏中能够实现目标,或者和其他玩家比赛,无疑是趣味性的一种重要实现手段。而在iOS中(和MacOS)中,伟大的苹果提供了Game Center,并提供了GameKit框架来让Game Center集成变得简单。

简单而言, Game Center提供了以下机制:

  • 用户管理和验证。你的游戏不用再考虑用户注册,登录,密码找回,存储分数等繁琐的功能实现。Game Center为你的游戏提供了一个本地玩家(local player),这个对象为所有的游戏共享,你只需要调用即可;
  • 排行榜。你只需要在 iTunesConnect中指定排行方式就可以轻松拥有一个或者多个排行榜;
  • 记录成就。你的游戏需要定义里程碑,调用Game Center就可以保存进度;
  • 挑战。Game Center提供了让玩家挑战其他玩家的机制。

实战

要让游戏支持Game Center,有三个步骤需要做:

  • 在iTunesConnect中配置;
  • XCode工程配置;
  • 代码支持;
    下面分开来讲。
    为了简单起见,我们假设:
  • 你的游戏功能已经基本开发完毕,本文只专注于Game Center集成这一部分;
  • 简单起见,本文没有涉及到玩家挑战等功能;
  • 开发用的编程语言为Swfit(如果用objective-C也类似);

在iTunesConnect中配置

如果你还没有在iTunesConnect中添加应用记录的话,你需要添加一个。可以查看这里 了解如何操作。

有了应用记录,你就可以配置Game Center了。
登录iTunesConnect,在My Apps中选中你的应用,点击"Features"栏,在左边的导航中找到"Game Center",如下图所示:

1459036406.349621.png

在页面中找到"Leaderboards (0) ",0表示目前有0个排行榜。

1459036892.281486.png

点击后面的"+",出现下面的界面:

1459037063.927618.png

这里让你选择是创建单一排行榜,还是合并的排行榜。我们选择单一排行榜(Single Leatherboard)
然后需要填一些基本信息:

  • "Leaderboard Reference Name",排行榜名称;
  • "Leaderboard ID",排行榜ID,后面程序需要这个;
  • Score Format Type,分数的格式,整数还是带小数点的分数;
1459037291.468255.png

填完基本信息后,我们需要添加至少一个排行榜的本地语言(Leaderboard Localization):

1459037716.171048.png

XCode工程配置

在 xCode中,找到target,选中 “Capabilities”标签栏,找到Game Center,打开开关:

1459037852.872571.png

XCode会将GameKit添加到你的工程。

代码支持

有了 Game Center后,要写的代码不多。我们只需要用代码做以下几件事:

  • 游戏启动时验证用户;
  • 游戏过程中提交用户得分;
  • 显示排行榜;
    简单起见,下面所有的代码都放在GameScene中。
    以下分开来说。

游戏启动时验证用户

因为Game Center所有的操作都需要本地玩家(local player),所以需要在启动时验证用户。
验证用户的逻辑其实很简单。就是看用户是否已经在本机登录过,如果没有,则弹出Game Center的登录界面:

func authenticateLocalPlayer(){
        
        let localPlayer = GKLocalPlayer.localPlayer()
        
        localPlayer.authenticateHandler = {(viewController, error) -> Void in
            
            if (viewController != nil) {
                let vc: UIViewController = self.view!.window!.rootViewController!
                vc.presentViewController(viewController!, animated: true, completion: nil)
            }
                
            else {
                print((GKLocalPlayer.localPlayer().authenticated))
            }
        }
        
    }

有了这段代码,只需要在GameScenedidMoveToView中调用一下上面这个方法就好了。

游戏过程中提交用户得分

实现如下:

func reportScore(score:Int) {
        //check if user is alredy logged in game center
        if GKLocalPlayer.localPlayer().authenticated {
            let scoreReporter = GKScore(leaderboardIdentifier: "grp.TopStrategist")
            scoreReporter.value = Int64(score)
            let scoreArray: [GKScore] = [scoreReporter]
            GKScore.reportScores(scoreArray, withCompletionHandler: {(error : NSError?) -> Void in
                if error != nil {
                    print("error:%@", error)
                }
            })
        }
    }

显示排行榜

显示排行榜一般需要:

  • 在用户点击显示排行榜时,暂停当前游戏;
  • 在用户退出排行榜后,继续当前游戏;

在界面上放一个按钮,当按钮响应时调用下面这个函数:

    //shows leaderboard screen
    func showLeader() {
        
        if stateMachine.currentState is GameSceneActiveState && !paused {
            togglePause()
        }
        
        let vc = self.view?.window?.rootViewController
        let gc = GKGameCenterViewController()
        gc.gameCenterDelegate = self
        vc?.presentViewController(gc, animated: true, completion: nil)
    }

上面的代码会弹出排行榜。
要响应退出排行榜继续游戏,需要GameScene实现 GKGameCenterControllerDelegate

class GameScene: GKGameCenterControllerDelegate 

这个GKGameCenterControllerDelegate只有一个方法需要我们实现:

    func gameCenterViewControllerDidFinish(gameCenterViewController: GKGameCenterViewController)
    {
        gameCenterViewController.dismissViewControllerAnimated(true, completion: nil)
        if stateMachine.currentState is GameSceneActiveState && paused {
            togglePause()
        }
        
    }

写到这里,Game Center的集成就完成了。用了 Game Cetner之后,是不是有让你的游戏如虎添翼的感觉?
如果本文对你有用,不妨考虑对我打赏 :)

参考资源

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容