一.    Cocos2d-x for Windows Phone

到2013年底,几大手游引擎都陆续支持WP8了,特别是Unity3D和Cocos2d-x。有过游戏开发经验的朋友们应该对这两个引擎不陌生,WP8对Native C++的支持,使得其他平台上用C++编写的游戏移植到WP8平台上变得非常简单。Cocos2d-x在2.2.1版本之前在WP8上只支持纯Direct3D工程模式,目前在Github上已提供了支持XAML的混合托管模式,传送门:https://github.com/MSOpenTech/cocos2d-x/tree/wp8-xaml2

Git下来之后打开cocos2d-wp8.vc2012.sln可以看到工程结构如下:

其中HelloCpp-XAML采用一个XAML与Direct3D组件混合的托管模式,是一个标准的WP8工程模板,编译并运行可见到:

其中的C#项目负责Windows Phone常规控件和页面逻辑,C++项目是一个基于Direct3D的Windows Phone Runtime Component,负责所有的游戏逻辑,两者通过DrawingSurface或DrawingSurfaceBackgroundGrid控件混入Direct3D图像,以非常小的性能代价获取托管代码的优秀特性。DrawingSurface 控件允许使用 Direct3D 来呈现显示在 XAML 控件后方或与其并列显示的图形。

在托管的XAML中,可以发现Direct3DInterop类在XAML引擎和Direct3D之间建立起了一个通信桥梁,作为XAML引擎和Direct3D代码之间的代理。在Direct3DInterop的实现中,CreateContentProvider方法初始化了一个Direct3DContentProvider类的实例,并强制转化为IDrawingSurfaceContentProvider,这个接口并没有任何内容,因为它并不是由代码实现的接口,而是使用WRL(Windows Runtime Library)实现的,将类强制转化为Windows Phone Runtime Component接口,以便由XAML引擎访问。

更多关于托管的XAML和Direct3D引擎的通信,请查看MSDN文档,传送门:http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207012%28v=vs.105%29.aspx

二.    演练:在Cocos2d-x中调用OpenXLive

OpenXLive是Windows Phone和Windows 8平台上最大的游戏社交网络平台,对Windows Phone游戏的开发提供了很多非常优秀的辅助功能,比如游戏基础功能(积分榜、成就、公告、在线玩家等)、推广功能(推荐游戏、推广墙)、社交功能(分享、动态、任务、交友)以及支付功能(支付宝、点卡支付、礼品卡)等一些列相关功能。除了OpenXLive之外,一批优秀的第三方库基本都是由C#编写的,如果需要在Direct3D中使用到这些功能,就需要采用拙者在此前提到的一个解决方案,传送门:

《WP8:在WinRT组件(C++)中调用C#类库的解决方案》

以下我们以OpenXLive为例子,介绍如何在Cocos2d-x中进行调用。

1.创建文件并添加引用

首先在cocos2d-x\samples\Cpp\HelloCpp\Classes文件目录下创建一个OpenXLiveHelper目录,并在该目录下添加以下三个文件:ICallback.h、XLiveDelegate.h和XLiveDelegate.cpp,并将他们添加到HelloCppComponent项目中:

2.定义WinRT接口ICallback

接下来在ICallback.h中定义一个WinRT接口,这个接口将在C#项目中具体实现:

 // A callback interface for C# code to implement.
public interface class ICallback
{
};

3.定义C++托管类XLiveDelegate

接下来定义一个C++托管类,所有Direct3D游戏逻辑通过这个托管类,利用ICallback接口调用具体的C#代码,这里采用单例模式管理这个托管类,在XLiveDelegate.h文件中添加以下代码:

 #include "ICallback.h"

 namespace PhoneDirect3DXamlAppComponent
{
namespace OpenXLiveHelper
{
// A native class to pass and store an ICallback instance, calling C# code via the ICallback object.
[Windows::Foundation::Metadata::WebHostHidden]
public ref class XLiveDelegate sealed
{
public:
// Gets the single XLiveDelegate instance.
static XLiveDelegate^ GetInstance();
// Set callback into the XLiveDelegate instance.
void SetCallback(ICallback^ callback);
// Gets or sets the callback.
property ICallback^ GlobalCallback; private:
XLiveDelegate();
static XLiveDelegate^ m_Instance;
};
}
}

4.实现C++托管类XLiveDelegate

接下来实现XLiveDelegate这个C++托管类,在XLiveDelegate.cpp文件中添加以下代码:

 #include "pch.h"
#include "XLiveDelegate.h" namespace PhoneDirect3DXamlAppComponent
{
namespace OpenXLiveHelper
{
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;
}
}

5.定义实现ICallback接口的C#类XLiveCallback

在C#项目HelloCpp中,在OpenXLive\OpenXLiveHelper中添加XLiveCallback.cs文件,并添加以下代码:

 using PhoneDirect3DXamlAppComponent.OpenXLiveHelper;

 namespace PhoneDirect3DXamlAppInterop
{
public sealed class XLiveCallback : ICallback
{
}
}

6.根据需求补充ICallback的接口方法,并在XLiveCallback中实现

例如需要在Direct3D游戏逻辑中获取一个成就,则在ICallback.h中定义一个接口方法:

 // Award an achievement completed event.
event Windows::Foundation::EventHandler<CompletedEventArgs^>^ OnAwardComplted;
void Achievement_Award(Platform::String^ achievementKey);

在XLiveCallback.cs中实现:

 public void Achievement_Award(string achievementKey)
{
Achievement ac = new Achievement(XLiveGameManager.CurrentSession, achievementKey);
ac.AwardCompleted += ac_AwardCompleted;
ac.Award();
} void ac_AwardCompleted(object sender, AsyncEventArgs e)
{
if (OnAwardComplted != null)
{
OnAwardComplted(sender, new CompletedEventArgs(e.Result.ReturnValue, e.Result.ErrorCode, e.Result.ErrorMessage));
}
}

观察上述逻辑,可以发现这实现过程其实是一个适配器模式的实现:

其中的ICallback为目标接口(Target),Achievement为需要适配的类(Adaptee),XLiveCallback则为适配器(Adapter),将原有接口转换为目标接口,而XLiveDelegate则为客户端(Client),负责管理和调用目标接口,而不必关心具体的适配接口。

至于其余的OpenXLive接口,拙者认为需要从游戏逻辑中向外POST并且获取返回通知的接口才需要进行封装,而UI跳转或其他GET类型的接口只需要在托管XAML示例中调用即可,附上拙者封装的一些接口。

ICallback.h源码下载

WP8:在Cocos2d-x中使用OpenXLive的更多相关文章

  1. WP8:在Unity中使用OpenXLive

    Unity 4.2正式版开始添加了对Windows 8.Windows Phone 8等其他平台的支持,而且开发者可以免费使用Unity引擎来开发游戏了.而作为Windows Phone和Window ...

  2. 如何在cocos2d项目中enable ARC

    如何在cocos2d项目中enable ARC 基本思想就是不支持ARC的代码用和支持ARC的分开,通过xcode中设置编译选项,让支持和不支持ARC的代码共存. cocos2d是ios app开发中 ...

  3. 如何在Cocos2D游戏中实现A*寻路算法(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  4. 如何在Cocos2D游戏中实现A*寻路算法(一)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  5. wp8 在OnBackKeyPress事件中调用MessageBox.Show()崩溃

    今天写代码的时候遇到一个问题,在wp8中执行下面的代码后,弹出对话框后,停滞一段时间程序退出. protected override void OnBackKeyPress(CancelEventAr ...

  6. WP8.1程序开发中,如何加载本地文件资源或安装在程序包中的资源。

    Web 要访问来自 Web 的文件,你可以使用标准的绝对 HTTP URI: <img src="http://www.contoso.com/images/logo.png" ...

  7. 如何在Cocos2D游戏中实现A*寻路算法(八)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  8. 如何在Cocos2D游戏中实现A*寻路算法(七)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  9. 如何在Cocos2D游戏中实现A*寻路算法(五)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

随机推荐

  1. IT在线笔试总结(一)

    综述:IT公司的技术类笔试,主要考察: (1)知识面的广度.主要考察一些业内通用性的知识,以及某一职务所必须具备的业务知识. (2)智力测试.主要考察记忆力,思维能力和学习新知识的能力. (3)技能测 ...

  2. 在配置dubbo框架的时候出现dubbo:application标签无法识别问题。

    这原因是因为目前 http://code.alibabatech.com/schema/dubbo/dubbo.xsd标签库打不开.所以我们需要在dubbo的jar包里面引入一个dubbo.xsd 解 ...

  3. phpstorm

    9XVKERIY9F-eyJsaWNlbnNlSWQiOiI5WFZLRVJJWTlGIiwibGljZW5zZWVOYW1lIjoiYXNoZXIgY2hlbiIsImFzc2lnbmVlTmFtZ ...

  4. wamp密码设置

    WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空,所以直接按回车 ...

  5. JavaScript ES6 的 let 和 var 的比较

    在JavaScript 1.7中, let 关键词被添加进来, 我听说它声明之后类似于"本地变量", 但是我仍然不确定它和 关键词 var 的具体区别. 回答: 不同点在于作用域, ...

  6. protobuff 配合 libevent 在Linux 和windows 下的使用

    protobuff 配合 libevent 在Linux 和windows 下的使用待补全. libprotobuf.lib libproto-lite.lib libprotoc.lib

  7. Echarts x轴显示不全

    xAxis : [ { type : 'category', data : ['采矿业','制造业','电力热力燃气及水生产和供应业','建筑业'], axisTick: { alignWithLab ...

  8. POJ 2155 Matrix (二维树状数组)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17224   Accepted: 6460 Descripti ...

  9. protocol buffers的使用示例[z]

    [http://blog.csdn.net/zhu_xun/article/details/19397081] protocol buffers的使用示例 如果不了解protocol buffers, ...

  10. shell脚本学习--shell中的变量$

    $$ :Shell本身的PID(ProcessID) $! :Shell最后运行的后台Process的PID $? :最后运行的命令的结束代码(返回值) $- :使用Set命令设定的Flag一览 $* ...