通过cocos2d-html5 + JSBinding + cocos2d-x + GameKit 简单实现本地蓝牙多人对战功能

为什么做这个:
最近正好想要为自己的新游戏(cocos2d-html5 + JSBinding + cocos2d-x)加入本地蓝牙对战的功能,但是在网上搜索了一圈没有发现比较相近的解决方案,于是就决定自己想办法寻找解决方案。
这里分享的就是一个简单的实现了本地蓝牙对战的功能的例子,如果你也在寻找类似资料的话,不妨看一看哦^_^

1-jpg

1-jpg
1-jpg
1-jpg
1-jpg

需要注意的东西:
. 这篇文章并不会讨论如何使用GameKit来实现蓝牙连接功能
. GameKit部分的代码基本都是照搬raywenderlich网站这个精彩的系列教程里面的例子
. 本人并不擅长Objective-C而且C++也好几年没有用了,所以代码中难免有一些不妥的语法或是像内存管理方面的问题
. 这个例子是我业余时间写的,所以功能发面并不完善(比如异常处理方面),只是实现了最基本的功能
. 本例子主要是演示了如何在不同语言之间进行相互调(Javascript <> Objective-C <> C++)再配合以GameKit实现本地蓝牙对战功能

示例程序包括:
. Javascript调用C++函数 (spidermonkey)
. C++和Objective-C的混编 (.mm)
. C++调用Javascript函数 (spidermonkey)
. 建立游戏 (作为服务器)
. 加入游戏 (作为客户端)
. 在服务器和多个客户端之间交换信息 (发送接收数据)

蓝牙功能相关主要流程:
. 所有的操作如”建立游戏 (作为服务器)”, “查找已建立的游戏”, “加入游戏 (作为客户端)”等功能都是从Javascript端发起的 (MyLayer)
. 以”加入游戏 (作为客户端)”为例
. Javascript端调用C++ (AppDelegate.h/mm)端定义的”joinServer”函数并将peerID和自身实例(MyLayer)一起传送
例: joinServer(peerID, this);
. C++端的”joinServer”被调用后(spidermonkey)继续调用下层的Objective-C实现的蓝牙功能(Gamekit)
例: [clientObject connectToServerWithPeerID:peerID];
. Objective-C端通过代理调用C++端相应的逻辑函数
例: self.delegate->clientDidConnect();
. 收到Objective-C端的通知后C++端调用Javascript定义的”clientDidConnect”
. Javascript在C++端调用后,一次调用的循环就结束了
简单总结一下整个调用过程就是: Javascript -> C++ -> Objective-C -> C++ -> Javascript

代码结构:
. MyApp.js — Javascript — 游戏逻辑起点
. GlobalJsFunc — C++ — spidermonkey所需的全局函数和变量
. AppDelegate — C++ — Objective-C和Javascript之间的桥梁,接收Javascript的调用后进一步调用Objective-C部分的函数并把结果返回给Javascript
. MatchmakingClient/MatchmakingClient — Objective-C — GameKit实现的蓝牙联机相关功能
. MatchmakingProtocol — C++ — 蓝牙连接相关协议,AppDelegate实现了这些协议
. Packet — Objective-C — 处理设备之间通过蓝牙传送的数据

点击查看Github上的示例代码  ^_^

例子还是很简单的,大家可以实机运行试试,如果有什么问题的话也欢迎提出 ~ 最后也欢迎各位关注一下我的新游戏~ 谢谢 ^_^