注:本人使用的是quick3.3版本,里面用到的一些类的路径可能会有不同,可以根据不同环境自行搜索使用的类所在位置,甚至调用的函数api也可能不同,但是只要明白作用,原理应该都是一样的,只是写法上可能略有区别
首先转载一篇GameCenter的使用指南,里面更多是如何对ios应用启用GameCenter的一些设置方法,主要是需要使用苹果开发者账户进行的一些设置
http://www.cocoachina.com/programmer/20101022/2229.html
转载的文章中的4开始往后的代码都是和GameCenter相关的一些具体实现代码,可以将这些方法直接放在quick cocos 的ios工程下的RootViewController.mm里作为RootViewController的对象方法。之前尝试改为类方法貌似会有问题,也可能是由于我还不大懂ios开发,如果有解决方式欢迎指教。
其中的authenticateLocalPlayer方法 为上面文章中启动GameCenter的登录模块。由于这些方法已经copy到RootViewController中作为RootViewController的对象方法,可以在quick cocos的ios工程下的AppController.mm中,在RootViewController初始化之后调用。如下:
viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil]; viewController.wantsFullScreenLayout = YES; viewController.view = eaglView; // Set RootViewController to window if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0) { // warning: addSubView doesn't work on iOS6 [window addSubview: viewController.view]; } else { // use this method on ios6 [window setRootViewController:viewController]; } [window makeKeyAndVisible]; //启动GameCenter登录 [viewController authenticateLocalUser];
这样在游戏起动时就可以启动登录GameCenter了。然后再在authenticateLocalPlayer 方法里可以处理登录成功的回调处理,登录成功后,可以从GKLocalPlayer里拿到GameCenter的一些参数,比如playerId,friend等,此时你可以选择将这些信息先存起来。 接着可以启动 cocos 的app正式进入游戏.
那么进入游戏后我们如何取到这些信息呢?这就需要使用quick 提供的lua调用OC的接口了
位置在quick/framework/luaoc.lua里。用到的函数就是luaoc.callStaticMethod,注意这个函数只能调用OC的类方法(也就是前面是+号的方法),具体需要传入的参数在lua文件的注视里已经写的很详细了,这里不再叙述了。注意其中一个args参数,里面是传给OC的参数字典。可以将回调函数的handle传入 用于执行lua调用OC后的回调。
另外注意一点,在OC这边和lua交互用到的一些方法需要先导入下面几个头文件
#import "cocos2d.h" #include "CCLuaEngine.h" #include "CCLuaBridge.h"
例如我要调用的是OC下面的一个叫login的函数,其中dict参数就是从lua那里传过来的args
+ (void)login:(NSDictionary*)dict { loginListener = [[dict objectForKey:@"loginListener"] intValue]; }
那么如何在OC那边执行完之后调用lua的回调呢?可以看下面代码,比如我们将GameCenter登录后的playerId作为参数再回传给lua这边
cocos2d::LuaValueDict item; item["code"] = cocos2d::LuaValue::stringValue("succeed"); item["playerId"] = cocos2d::LuaValue::stringValue([[GKLocalPlayer localPlayer].playerID cStringUsingEncoding:NSUTF8StringEncoding]); cocos2d::LuaBridge::pushLuaFunctionById(loginListener); cocos2d::LuaBridge::getStack()->pushLuaValueDict(item); cocos2d::LuaBridge::getStack()->executeFunction(1);
其中pushLuaFunctionById里传入的loginListener就是在 调用的login时从数据字典中取出的回调函数。最后再通过
cocos2d::LuaBridge::getStack()->executeFunction(1);
这句来执行回调lua的函数。
比如我回调的是lua里面的onLoginResult函数。里面的result参数就可以取到之前从OC那边传过来的数据了
function LoginScene:onLoginResult(result) code = result.code playerId = result.playerId end
这样我们就完成了通过接入GameCenter后将GameCenter的参数传入给我们游戏自身的处理。之后再用这些参数做连接自身游戏服务端的具体登录,由于不同游戏的需求不同,就不继续说了。
以上。