zoukankan      html  css  js  c++  java
  • 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上的截图例如以下所看到的:

    1.jpg

    1419561110799196.jpg

    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模块:在cocos2dcocosplatformwinrtInputEventTypes.h文件里添加新Event的定义(比方WeChat)

    1
    2
    3
    4
    5
    6
    7
    public enum class Cocos2dEvent
    {
       ShowKeyboard,
       HideKeyboard,
       TerminateApp,
       WeChat //add new event
    };

    2.WinRT模块:在cocos2dcocosplatformwp8CCGLView.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


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

  • 相关阅读:
    hello word
    HDU 1006 Tick and Tick
    HDU 1005 Number Sequence
    HDU 1004 Let the Balloon Rise
    HDU 1003 Max Sum
    HDU 1002 A + B Problem II
    HDU 1001 Sum Problem
    HDU 1000 A + B Problem
    POJ 2253 Frogger
    POJ 2387 Til the Cows Come Home
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6705932.html
Copyright © 2011-2022 走看看