Cocos2d-x游戏移植到WP8之路 -- c++和c#交互
Cocos2d-x是眼下最流行的手机游戏引擎之中的一个,开源、轻量、多平台等的诸多特性使得它被非常多国内外手游开发人员所喜爱。
利用Cocos2d-x来开发Windows Phone 8的游戏相同也是非常的方便高效。
当然不论什么跨平台的游戏引擎,终于解决的都仅仅能是游戏层面的问题:包含场景的管理、图形的渲染、真实物理世界的模拟等;要想真正在一个平台上把游戏做好。不可避免会遇到非常多和平台相关的问题,须要我们每一个游戏程序猿对于该平台的技术有个比較深入的了解。在Windows Phone 8这个平台上,我希望通过自己的努力帮助大家解决移植过程中遇到的问题。
从程序架构角度。首先须要向大家说明的是。眼下Cocos2d-x 3.2下面的版本号生成的Windows Phoneproject。主要是针对Windows Phone SilverLight 8.0的Framework。而最新8.1系统的Windows XAML App Framework则是3.3版本号之后才会完美支持。眼下程序的结构本质上就是带XAML应用的Direct3D的程序模型。project在SolutionExplore上的截图例如以下所看到的:


Cocos2dx-–WP8projectDirect3D and XAML App project
能够看出。二者很类似,均由二个部分组成。
第一个部分是C#编码的基于XAML的项目。比方图中的DemoGame,主要负责Windows Phone常规控件和页面逻辑;还有一个部分是C++编码的基于Direct3D的Windows Phone Runtime Component,负责全部的游戏逻辑,比方图中DemoGameComponent。这两者通过DrawingSurface或DrawingSurfaceBackgroundGrid控件来渲染Direct3D图像。以很小的性能代价获取托管代码的优秀特性。在托管的XAML中,能够发现Direct3DInterop类在XAML引擎和Direct3D之间建立起了一个通信桥梁,作为代码之间的代理。很多其它关于托管的XAML和Direct3D引擎的通信,请查看MSDN文档。
链接地址: http://msdn.microsoft.com/library/windows/apps/jj207012(v=vs.105).aspx
正是因为这样的双模块的结构,给大家移植工作带来一些麻烦。
主要表现为。大量的第三方SDK,比方腾讯的微信、OpenXLive等都是XAML层的SDK,须要大家在XAML层加入对应功能;而Cocos2d-x的游戏逻辑一般放在C++的WinRT层。这样这二个模块之间的交互工作就不可缺少。最简单的需求场景就是Cocos2dx发一个指令,调用XAML层的第三方SDK的某个功能。
怎样做到这一点呢?我给大家二个方案。
方案一:扩充Cocos2dEvent
前文提到,Direct3Dinterop类在二个模块之间扮演了交互的角色。所以。我们全然能够使用这种方法来实现自己的需求。详细做法例如以下:
1.WinRT模块:在cocos2d\cocos\platform\winrt\InputEventTypes.h文件里添加新Event的定义(比方WeChat)
| 
1 
2 
3 
4 
5 
6 
7 | publicenumclassCocos2dEvent{   ShowKeyboard,   HideKeyboard,   TerminateApp,   WeChat //add new event}; | 
2.WinRT模块:在cocos2d\cocos\platform\wp8\CCGLView.h & cpp中添加新Event向XAML模块抛出消息的函数(比方OnWeChat)
| 
1 
2 
3 
4 
5 
6 
7 | voidGLView::OnWeChat(){    if(m_delegate)    {        m_delegate->Invoke(Cocos2dEvent::WeChat);    }} | 
3.WinRT模块:在Cocos2dx的代码中依据须要使用上述函数
| 
1 | GLView::sharedOpenGLView()->OnWeChat(); | 
4.XAML模块:在mainpage.xaml.cs文件的OnCocos2dEvent函数中,接受新Event。并添加C#的功能代码
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 | publicvoidOnCocos2dEvent(Cocos2dEvent theEvent){     Dispatcher.BeginInvoke(() =>     {         switch(theEvent)         {           caseCocos2dEvent.WeChat:           WXAPIFactory.CreateWXAPI(AppID).OpenWXApp();           break;                  … }}} | 
以上步骤是在Cocos2dx代码中直接打开微信的演示样例。使用这样的方法的长处是借用原来的程序结构,开发比較方便,代码修改比較小;缺点是不够灵活,不支持參数。仅仅能通过添加Event 定义的方法来支持有限的參数。
方案二:使用WinRT 组件中调用 C# 类库的标准解决方式
详细过程例如以下所看到的:
1.WinRT模块:在Cocos2dx的代码的头文件中(比方HelloWorldScene.h)。定义WindowsPhone RunTime的接口ICallback(注意以下的namespace)
| 
1 
2 
3 
4 
5 
6 
7 | namespacePhoneDirect3DXamlAppComponent{    [Windows::Foundation::Metadata::WebHostHidden]    publicinterface classICallback    {    };} | 
2.WinRT模块:定义C++托管类XliveDelegate(仍然放在上述的namespace里)
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 | [Windows::Foundation::Metadata::WebHostHidden]publicref classXLiveDelegate sealed{    public:    staticXLiveDelegate^ GetInstance();    voidSetCallback(ICallback^ callback);    property ICallback^ GlobalCallback;    private:    XLiveDelegate();    staticXLiveDelegate^ m_Instance;}; | 
3.WinRT模块:在Cocos2dx的代码的cpp文件中(比方HelloWorldScene.cpp),实现上述托管类,传递ICallback对象保存在托管类中
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 | namespacePhoneDirect3DXamlAppComponent{    XLiveDelegate::XLiveDelegate()    {    }    XLiveDelegate^ XLiveDelegate::GetInstance()    {        if(m_Instance == nullptr)        {            m_Instance = ref newXLiveDelegate();        }        returnm_Instance;    }    voidXLiveDelegate::SetCallback(ICallback^ callback)    {        GlobalCallback = callback;    }    XLiveDelegate^ XLiveDelegate::m_Instance = nullptr;} | 
4.XAML模块:在C#文件中(比方mainpage.xaml.cs)定义WinRT接口ICallback的C#实现(XLiveCallback)
| 
1 
2 
3 
4 
5 
6 | namespacePhoneDirect3DXamlAppComponent{    publicsealed classXLiveCallback : ICallback    {    }} | 
5.XAML模块:创建XLiveCallback对象传递回上述C++的托管类
| 
1 | XLiveDelegate.GetInstance().SetCallback(newXLiveCallback()); | 
6.WinRT模块:扩充ICallback接口(添加了ShowGameCenter函数)
| 
1 
2 
3 
4 
5 
6 
7 
8 | namespacePhoneDirect3DXamlAppComponent{    [Windows::Foundation::Metadata::WebHostHidden]    publicinterface classICallback    {        virtualvoidShowGameCenter();    };} | 
7.XAML模块:在XLiveCallback中实现扩充部分(ShowGameCenter的详细实现)
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 | namespacePhoneDirect3DXamlAppComponent{    publicsealed classXLiveCallback : ICallback    {       publicvoidShowGameCenter()        {           OpenXLive.Silverlight.XLiveUIManager.ShowGameCenter();         }    }} | 
8.WinRT模块:在Cocos2dx代码中通过接口调用C#实现的功能
| 
1 | XLiveDelegate::GetInstance()->GlobalCallback->ShowGameCenter(); | 
9.XAML模块:使用例如以下方法。避免产生UI线程和后台工作线程之间的数据交互冲突
| 
1 | Deployment.Current.Dispatcher.BeginInvoke(() => | 
以上步骤是在Cocos2d-x代码中直接打开OpenXLive的GameCenter,供大家參考。使用这样的方法的长处是採用标准化的解决方式,能够灵活支持各类带參数接口。缺点是须要一定的知识门槛,代码修改相对照较多,调试不太方便。
关于这边博文,我借鉴了例如以下站点的内容。
链接地址:
http://www.cnblogs.com/zhxilin/archive/2013/03/20/2971331.html
http://wiki.openxlive.net/Applying-OpenXLive-to-Cocos2d-x-Game-for-WP8.ashx
最后。我默认各位读者对于Cocos2d-x已是很的熟悉。假设大家对于Cocos2d-x引擎本身或怎样在WP8上建立Cocos2d-x开发环境不清楚的话。推荐大家去观看我在微软虚拟在线课堂上的免费课程。
链接地址:http://www.microsoftvirtualacademy.com/training-courses/854
感谢微软(中国)有限公司开发体验和合作事业部--开发技术顾问 -- 梅颖广老师(yimei@microsoft.com)所提供的教程。
Cocos2d-x游戏移植到WP8之路 -- c++和c#交互的更多相关文章
- Cocos2d-x项目移植到WP8小记
		Cocos2d-x项目移植到WP8小记 作者: K.C. 日期: 10/24/2013 Date: 2013-10-24 00:33 Title: Cocos2d-x项目移植到WP8小记 Tags: ... 
- 1.cocos2dx存储卡的游戏代码、而游戏移植到“华为荣耀”电话、问题的总结移植
		 1记忆卡片游戏代码 CardItem.h #pragmaonce #ifndef__CardItem_H__ #define__CardItem_H__ #include"cocos2 ... 
- 将Unity3D游戏移植到Android平台上
		将Unity3D游戏移植到Android平台是一件很容易的事情,只需要在File->Build Settings中选择Android平台,然后点击Switch Platform并Build出ap ... 
- Cocos2d—X游戏开发之CCToggle(菜单标签切换)CCControlSwitch(开关切换)
		Cocos2d—X游戏开发之CCToggle(菜单标签切换) 首先继承子CCMenu,是菜单标签中的一种.‘ class CC_DLL CCMenuItemToggle : public CCMenu ... 
- iOS cocos2d 2游戏开发实战(第3版)书评
		2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ... 
- Cocos2d-x项目移植到WP8系列之三:C++和C#的交互
		原文链接: http://www.cnblogs.com/zouzf/p/3971021.html 上一篇提到工程使用 XAML 和 Direct3D 项目模板 是因为要涉及到C++和C#的交互,微软 ... 
- Cocos2d-x项目移植到WP8系列之二:开篇
		原文链接: http://www.cnblogs.com/zouzf/p/3970130.html 开发环境一笔带过吧,主板和CPU要支持虚拟化技术,要开启才行,装个64位win8.1系统,win8不 ... 
- Cocos2d-x项目移植到WP8系列之一:前传
		原文链接: http://www.cnblogs.com/zouzf/p/3969993.html 许久没动笔了,随想一直都有动笔的想法,但拖来拖去,归根到底还是一个懒字吧 .发现人的惰性真是太强大了 ... 
- 【winows7+android-ndk-r9+Cygwin 】cocos2dx 2.*游戏移植Android平台完全手册
		为了有不少走的弯路.这里简要记录cocos2d开发环境的搭建.android开发环境搭建.android NDK环境搭建.终于实现cocos2dx 2.* 游戏Android平台移植. 转载请注明出处 ... 
随机推荐
- 查看centos当前版本
			# rpm -q centos-release centos-release-5-4.el5.centos.1 
- 大型开放式网络课程MOOC的一点体会
			2012年,美国的顶尖大学陆续设立网络学习平台,在网上提供免费课程,Coursera.Udacity.edX三大课程提供商的兴起.给很多其它学生提供了系统学习的可能.这就是大型开放式网 ... 
- CAD打开慢,卡在99%
			问题描述 打开AutoCAD的时候,软件停留在加载99%,点击出现[无法响应],要么等待,要么强行关闭,若平时正常关闭CAD时也异常缓慢. 原因分析 破解版,没有联网就激活了.CAD默认启动需要联网, ... 
- POSIX 线程 – pthread_sigmask
			http://www.cnblogs.com/qq78292959/archive/2012/04/05/2432985.html 概念 按照 POSIX, 异步 (外部) 信号发送到整个进程. 所有 ... 
- GraphQL返回分页对象
			private GraphQLOutputType testUserOutputType; private GraphQLOutputType pageType; private void initO ... 
- HDU 5399 Too Simple(过程中略微用了一下dfs)——多校练习9
			Too Simple Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Probl ... 
- oracle 插入表数据的4种方式
			1.往表中插入一整行数据 /*方法一*/ INSERT INTO 表名 VALUES(val1,val2,val3,...); /*方法二*/ '; 如: ,, FROM DUAL; 注意: 2. ... 
- 所有标准API
			序号 系统版本 模块 应用场景 类型 API/接口 参数规格 样例代码 备注 登记者 登记时间 关键字 1 12.1.3 AP 付款核销 API ap_pay_invoice_pkg.ap_pay_i ... 
- JDK1.7的一些新特性
			整理了几条对开发可能用到概率高的 1.swicth支持对String的判断:(以前只能支持Int及以下的) switch (s) { case "1": break; case & ... 
- 新浪微博 使用OAuth2.0调用API
			# -*- coding: cp936 -*- #python 2.7.10 #xiaodeng #新浪微博 使用OAuth2.0调用API #微博开放接口的调用,都需要获取用户的身份认证.目前微博开 ... 
