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

public enum class Cocos2dEvent

{

   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

void GLView::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

public void OnCocos2dEvent(Cocos2dEvent theEvent)

{

     Dispatcher.BeginInvoke(() =>

     {

         switch (theEvent)

         {

           case Cocos2dEvent.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

namespace PhoneDirect3DXamlAppComponent

{

    [Windows::Foundation::Metadata::WebHostHidden]

    public interface class ICallback

    {

    };

}

2.WinRT模块:定义C++托管类XliveDelegate(仍然放在上述的namespace里)


1

2

3

4

5

6

7

8

9

10

11

[Windows::Foundation::Metadata::WebHostHidden]

public ref class XLiveDelegate sealed

{

    public:

    static XLiveDelegate^ GetInstance();

    void SetCallback(ICallback^ callback);

    property ICallback^ GlobalCallback;

    private:

    XLiveDelegate();

    static XLiveDelegate^ 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

namespace PhoneDirect3DXamlAppComponent

{

    XLiveDelegate::XLiveDelegate()

    {

    }

    XLiveDelegate^ XLiveDelegate::GetInstance()

    {

        if (m_Instance == nullptr)

        {

            m_Instance = ref new XLiveDelegate();

        }

        return m_Instance;

    }

    void XLiveDelegate::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

namespace PhoneDirect3DXamlAppComponent

{

    public sealed class XLiveCallback : ICallback

    {

    }

}

5.XAML模块:创建XLiveCallback对象传递回上述C++的托管类


1

XLiveDelegate.GetInstance().SetCallback(new XLiveCallback());

6.WinRT模块:扩充ICallback接口(添加了ShowGameCenter函数)


1

2

3

4

5

6

7

8

namespace PhoneDirect3DXamlAppComponent

{

    [Windows::Foundation::Metadata::WebHostHidden]

    public interface class ICallback

    {

        virtual void ShowGameCenter();

    };

}

7.XAML模块:在XLiveCallback中实现扩充部分(ShowGameCenter的详细实现)


1

2

3

4

5

6

7

8

9

10

namespace PhoneDirect3DXamlAppComponent

{

    public sealed class XLiveCallback : ICallback

    {

       public void ShowGameCenter()

        {

           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

感谢微软(中国)有限公司开发体验和合作事业部--开发技术顾问 -- 梅颖广老师([email protected])所提供的教程。

时间: 2024-12-15 23:22:53

Cocos2d-x游戏移植到WP8之路 -- c++和c#交互的相关文章

Unity 游戏移植到 Windows10 之路 -- 环境搭建

孙广东   2015.8.31 原文:http://blogs.msdn.com/b/windows__windows_game_dev_faq_/archive/2015/08/19/unity-windows10.aspx Windows10 是微软公司最新一代的跨平台及设备应用的操作系统.它统一了包括个人电脑.平板电脑.智慧型手机.嵌入式系统.Xbox One以及新产品Surface Hub和HoloLens等等的整个Windows产品系列的作业系统,共享一个通用的应用程式架构(UWP)和

1.cocos2dx记忆卡片游戏代码、并将游戏移植到“华为荣耀”手机上、移植中的问题总结

 1记忆卡片游戏代码 CardItem.h #pragmaonce #ifndef__CardItem_H__ #define__CardItem_H__ #include"cocos2d.h" USING_NS_CC; classCardItem :publicCCSprite { public: staticCardItem *create(intidx); boolinit(intidx); CCLabelTTF *ttf; CCSprite *bg; CC_SYNTHESI

Unity Android中的游戏移植

本周在旧金山举办的游戏开发者大会上,Unity宣布他们的Unity Android软件可以有偿的为开发者提供将他们自己开发的iOS平台上的游戏移植到Android平台的服务,据该公司宣称移植过程简单到只需选取要移植的平台,点下Biuld就可以了. 快捷移植,实惠价格 实际上Unity的软件已经开始测试有好几个月了,去年中旬开始,50多个游戏开发者使用了该服务,根据几位(分别是Marc Andreoli,Pat Toulouse, Benjamin Vu)先吃螃蟹者的描述来看,效果还是比较不错的.

Cocos2d-x项目移植到WP8系列之二:开篇

开发环境一笔带过吧,主板和CPU要支持虚拟化技术,要开启才行,装个64位win8.1系统,win8不好用,我用的是vs2012,然后装个wp8的SDK,再装个vs2012的补丁4,最后能把模拟器跑起来能上网就可以了.模拟器上网这也是个蛋疼问题,如果电脑是通过路由器DHCP自动分配IP模拟器能正常上网,但在公司里电脑是根据Mac地址绑定IP的,模拟器上不了网,这里面碰到问题的话自行谷歌吧. 公司的框架是在Cocos2d-x的框架之上稍微封装了一下,方便加上一些自己的功能,总的来说就是业务层用Lua

Cocos2d-x项目移植到WP8系列之一:前传

许久没动笔了,随想一直都有动笔的想法,但拖来拖去,归根到底还是一个懒字吧 .发现人的惰性真是太强大了,特别是在像我这种意志不够坚定的人,稍微拖一拖,一个星期,一个月,大半年,就这样都过去了,加上平时的效率也挺低的,时间都浪费得让人心痛,再和一些刚毕业一年的后辈相比,发现根本跟不上他们的步伐,无论是已掌握的技术或者学习新的东西,才猛然惊醒,甚为愧疚.针对性下药,现在强迫自己把一些要做的工作上的事情都写在一个几乎从不关闭的Excel里,每次回到桌面都能看到,还有哪些事情没有完成的,完成后就标记一下,

Cocos2d-x项目移植到WP8系列之三:C++和C#的交互

上一篇提到工程使用 XAML 和 Direct3D 项目模板 是因为要涉及到C++和C#的交互,微软给我们提供了一个叫运行时组件的东西(也就是 windows phone 运行时组件 模板,一下简称winRT组件)来实现两者的交互.winRT组件 工程里用的C++/CX语言(关于winRT自行谷歌),但完全兼容C++.在winRT组件 工程里,里面定义的类和方法只要符合一定的规范,就能被C#的工程直接访问到,那C++如何访问C#呢?毕竟,在Cocos2dx-wp8框架里,除了一开始启动是从xam

【winows7+android-ndk-r9+Cygwin 】cocos2dx 2.*游戏移植Android平台完全手册

为了有不少走的弯路.这里简要记录cocos2d开发环境的搭建.android开发环境搭建.android NDK环境搭建.终于实现cocos2dx 2.* 游戏Android平台移植. 转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/24498213 cocos2dx 2.* 游戏Android平台移植所须要的必要条件 1.cocos2d开发环境搭建,请见前面写的文档:http://blog.csdn.net/oyangyufu/ar

[cocos2dx]怎样将Android手机游戏移植到电视?

近期智能电视很火,我也买了一个小米电视,看片效果不错,网络也还算给力.可是,玩游戏比較蛋疼,要用遥控器,下了一个捕鱼达人试玩了一把,要用方向键控制大炮的方向和远近,再用确定键发射炮弹,根本没法玩...这个问题的解决办法在于,手机游戏都是为触摸屏设计的,移植到电视的大屏幕上,没有触摸屏了,要改用遥控器或者手柄操作,就要改变游戏的玩法,不但移植复杂,并且最致命的是,会大大减少游戏的乐趣.那有没有办法在电视上玩手机游戏呢?假设能够把手机的触摸事件转发到电视上,就能够.我试着做了一个Demo,能玩,但有

Unity 游戏移植与手指触控识别-JDK 安装与环境参数配置

目前各游戏公司在使用Unity3D开发的游戏产品中,一般都不会仅仅停留在PC 端Windows 平台的游戏发布与运营,而是面向所有主要的游戏平台,尤其以目前的移动端Android与IOS 平台为主. 由于Android平台的开放性与普遍性,本文主要探讨此平台的环境配置与搭建过程.Android 是运行在手机上的目前全世界最大众化的操作系统,由Google 公司研发. Android平台环境配置主要分为三大步骤: 1: JDK安装与环境参数配置. 2: Android虚拟机的安装与配置. 3: U