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

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

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

  1. Cocos2d-x项目移植到WP8小记

    Cocos2d-x项目移植到WP8小记 作者: K.C. 日期: 10/24/2013 Date: 2013-10-24 00:33 Title: Cocos2d-x项目移植到WP8小记 Tags: ...

  2. 1.cocos2dx存储卡的游戏代码、而游戏移植到“华为荣耀”电话、问题的总结移植

     1记忆卡片游戏代码 CardItem.h #pragmaonce #ifndef__CardItem_H__ #define__CardItem_H__ #include"cocos2 ...

  3. 将Unity3D游戏移植到Android平台上

    将Unity3D游戏移植到Android平台是一件很容易的事情,只需要在File->Build Settings中选择Android平台,然后点击Switch Platform并Build出ap ...

  4. Cocos2d—X游戏开发之CCToggle(菜单标签切换)CCControlSwitch(开关切换)

    Cocos2d—X游戏开发之CCToggle(菜单标签切换) 首先继承子CCMenu,是菜单标签中的一种.‘ class CC_DLL CCMenuItemToggle : public CCMenu ...

  5. iOS cocos2d 2游戏开发实战(第3版)书评

    2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...

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

    原文链接: http://www.cnblogs.com/zouzf/p/3971021.html 上一篇提到工程使用 XAML 和 Direct3D 项目模板 是因为要涉及到C++和C#的交互,微软 ...

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

    原文链接: http://www.cnblogs.com/zouzf/p/3970130.html 开发环境一笔带过吧,主板和CPU要支持虚拟化技术,要开启才行,装个64位win8.1系统,win8不 ...

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

    原文链接: http://www.cnblogs.com/zouzf/p/3969993.html 许久没动笔了,随想一直都有动笔的想法,但拖来拖去,归根到底还是一个懒字吧 .发现人的惰性真是太强大了 ...

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

    为了有不少走的弯路.这里简要记录cocos2d开发环境的搭建.android开发环境搭建.android NDK环境搭建.终于实现cocos2dx 2.* 游戏Android平台移植. 转载请注明出处 ...

随机推荐

  1. 为Ubuntu 安装Transmission 2.90

    Transmission 是 Ubuntu 的默认 BitTorrent 客户端,近期发布了最新的 Transmission 2.90 版本,目前已经可通过 PPA 为 Ubuntu 15.10.Ub ...

  2. 关于NLPIR应用在KETTLE中的探索

    一:什么是NLPIR? NLPIR汉语分词系统(自然语言处理与信息检索共享平台),主要功能包括中文分词:词性标注:命名实体识别:用户词典功能:支持GBK编码.UTF8编码.BIG5编码.新增微博分词. ...

  3. [Algorithm] Tower Hopper Problem

    By given an array of number, each number indicate the number of step you can move to next index: For ...

  4. Android图片与缩略

    /** * 将图片文件原比例缩略.并使其不超过最大宽.高 * @param path : 图片文件 * @param requestW : 缩略后最大宽度 * @param requestH : 缩略 ...

  5. SMTP 协议系列一

    解说一下DOS下telnet命令发送邮件 步骤,以我的163邮箱为例 1.開始-->cmd 进入到dos里面 2.输入telnet  smtp.163.com  25 C: \Users \Ad ...

  6. (LeetCode 160)Intersection of Two Linked Lists

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  7. 火狐浏览器Firefox Firefox中的xpi文件是什么

    firefox中的xpi文件是什么? 问一下 最佳答案 XPI是什么? firefox中的xpi实际上类似于IE中的插件或扩展(如Flash插件等). 格式一般为.Zip, 由XUL.Javascri ...

  8. 同时安装不同版本JDK遇到的问题

    安装JDK1.8出现 Error opening registry key'software\Javasoft\Java Runtime Environment' java安装1.8后的问题:之前安装 ...

  9. wepy - 与原生有什么不同(request)

    关于request导入,清先查看这篇文档了解大概 缺陷: wx.request一个页面最多支持10个wx.request,况且不能保证请求先后顺序  对于wepy来说,使用了ES6 的Promise以 ...

  10. SettingsPLSQLDeveloper

      迁移时间:2017年5月21日10:12:23Author:Marydon 一.常用配置项UpdateTime--2017年3月15日13:55:46注:没有安装Oracle数据库的情况下,前两步 ...