iOS游戏开发之Game Center研究
发布日期:2021-10-16 14:44:01 浏览次数:2 分类:技术文章

本文共 3754 字,大约阅读时间需要 12 分钟。

Game Center概述

GameCtr_aware_GameFlow_2x.png

在App Store中,最流行的应用类型非游戏莫属。几乎所有的用户都下载并玩过游戏。有各种样的游戏玩家,有人为之痴狂,有人只是偶尔玩玩。不过无论是哪种玩家,都会注重游戏的趣味性。在游戏中能够实现目标,或者和其他玩家比赛,无疑是趣味性的一种重要实现手段。而在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之后,是不是有让你的游戏如虎添翼的感觉?

如果本文对你有用,不妨考虑对我打赏 :)

参考资源



文/MarkNote(简书作者)
原文链接:http://www.jianshu.com/p/4279f84d8340
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

转载地址:https://blog.csdn.net/songchunmin_/article/details/70810232 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:npm的--save和--save-dev参数
下一篇:pixi.js教程中文版--基础篇

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年03月29日 14时42分02秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

手机gps信息提取并储存到本地_通信人的实用技巧,如何在日常拍的照片里提取GPS位置信息... 2019-04-21
mysql5717开发设置怎么调回来_mysql 5.7.17 安装配置方法图文教程 2019-04-21
微信小程序 获取当前手机的可视_转载 JS获取当前手机浏览器可视区域大小 2019-04-21
ubuntu安装grafana_Ubuntu 16.04 安装Grafana并配置监控(Grafana + MySQL) 2019-04-21
图上上传页面设计_福利活动丨四周年专题页面今日上线,参与活动领取狼蛛新皮肤!... 2019-04-21
java number 相加_Java 中的数据流和函数式编程 2019-04-21
mysql 物流系统_物流配送管理系统(ssm,mysql) 2019-04-21
mysql 字段关键字冲突_python mysql 字段与关键字冲突的解决方式 2019-04-21
html360搜索框代码,HTML 代码标签 2019-04-21
html创建自定义函数,jquery怎么自定义函数 2019-04-21
mysql 运行 compile_install mysql by compile(通过编译安装mysql) 2019-04-21
java数字时钟控件_Java-数字时钟(简易版) 2019-04-21
python回到首行_python读取文件首行和最后一行 2019-04-21
java 全局变量 局部变量的区别_java中全局变量和局部变量的区别是什么? 2019-04-21
rust蓝卡怎么开_Rust娘个人资料简介,角色作品介绍 2019-04-21
将10个成绩排序java程序_快速排序——成绩排序 2019-04-21
java+map申明_Java中两种HashMap申明方式区别? 2019-04-21
myftpadmin+proftpd+mysql架设ftp服务器_[教程]在CentOS7上配置 FTP服务器 Proftpd 支持 MySQL 虚拟用户加密认证以及磁盘限额(Quota)... 2019-04-21
Java三层结构的概念_Java中的mvc和三层结构究竟是什么关系 2019-04-21
java中时刻显示时间的插件_Java中bootstrap-datetimepicker时间插件的使用 2019-04-21