Cocos2d-x项目移植到WP8系列之三:C++和C#的交互
原文链接: http://www.cnblogs.com/zouzf/p/3971021.html
上一篇提到工程使用 XAML 和 Direct3D 项目模板 是因为要涉及到C++和C#的交互,微软给我们提供了一个叫运行时组件的东西(也就是 windows phone 运行时组件 模板,一下简称winRT组件)来实现两者的交互。winRT组件 工程里用的C++/CX语言(关于winRT自行谷歌),但完全兼容C++。在winRT组件 工程里,里面定义的类和方法只要符合一定的规范,就能被C#的工程直接访问到,那C++如何访问C#呢?毕竟,在Cocos2dx-wp8框架里,除了一开始启动是从xaml-C# 端开始之外,后面的运行都是在C++工程里,只是在有必要的时候,C++才会访问回C#,谷歌了一下,主流的解决方法是利用callback的思想实现,可以看看别人的实现: WP8:在WinRT组件(C++)中调用C#类库的解决方案 Calling C# method from C++ code in WP8 。
上面两篇文章基本上已经把C++和C#的交互这个问题比较清晰地解决掉了,但只是在winRT组件的C++和C#工程交互,而在我项目的具体实现里要求类似如下:C#工程依赖winRT工程,winRT工程依赖其他工程如Cocos2d工程(公司框架是直接在Cocos2d-x框架的源码基础上修改和增加,而不是使用Cocos2d-x项目生成的DLL)。如果Cocos2d工程有需要访问C#的话,怎么办?毕竟,Cocos2d工程才是作为主游戏逻辑的工程,而winRT工程更多是偏向于通道的作用,总不能把游戏逻辑的东西都挪到winRT工程里吧(虽然Cocos2d-x自带的HelloCpp例子是这样子做的~~)。
下面说一下个人的实现
前半段和上面那两个链接一样,实现winRT组件访问C#,需要注意的是在定义ICallxxx 接口的那个h文件里,别include太多自己的头文件,否则 被include的头文件 以及 被include的头文件里include的头文件(递归)所在的路径都要加到工程头文件依赖里。
后半段,在主游戏逻辑所在的工程里(winRT组件工程依赖主游戏逻辑工程),实现一个单例类,主要就是定义一个函数指针 void (*FunCallCS_ImageCropper)();//, h文件如下:
class WZCallCS_And_BackToLua_Image
{
public: static WZCallCS_And_BackToLua_Image* Share_GetInstance(); void (*FunCallCS_ImageCropper)();//在CX里被实现为调用CS的方法 private: static WZCallCS_And_BackToLua_Image* m_pInstance; WZCallCS_And_BackToLua_Image();
~WZCallCS_And_BackToLua_Image(); //把复制构造函数和=操作符也设为私有,防止被复制,只声明不实现,为什么?
WZCallCS_And_BackToLua_Image(const WZCallCS_And_BackToLua_Image&);
WZCallCS_And_BackToLua_Image& operator=(const WZCallCS_And_BackToLua_Image&); };
还记得winRT组件工程里的那个能被C#访问的类吧,那个类里有一个setCallback 方法,实现改为如下:
void WZCallCS_And_BackToCX_Image::setCall_FromCXToCS(ICallCS_And_BackCX_Image^ callback)
{
globalCallCS = callback; WZCallCS_And_BackToLua_Image *callCS = WZCallCS_And_BackToLua_Image::Share_GetInstance(); callCS->FunCallCS_ImageCropper = [] ()
{
globalCallCS->getPictureFromPhotos("");
};
}
在这里给 单例类的函数指针 一个实现,让函数指针指向一个lambda表达式,实现内容就是访问一个在C#里实现的方法,如此一来,在C++里需要访问C#的时候,就获取那个单例类,调用单例类里的函数指针即可。需要注意的时候,把lambda表达式赋给一个函数指针时,lambda表达式的函数体里是不能捕获外部变量的,如果lambda表达式函数体里要访问什么,就只能通过静态变量 全局变量的方式来实现了。
需要注意的是,这部分工作必须早点做,也就是C#工程里继承winRT组件 ICallback的那个类必须尽早(最好在mainPage 的loaded事件里做)被创建并调用winRT组件那个类的setCallback 方法,否则单例类的函数指针有可能在初始化前就被调用了。整个流程可以理解在程序启动初始化的时候就搭好一条 C++和C# 交互的通道,主游戏逻辑想什么时候通过这条通道来访问C#都可以。
原文链接: http://www.cnblogs.com/zouzf/p/3971021.html
Cocos2d-x项目移植到WP8系列之三: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 许久没动笔了,随想一直都有动笔的想法,但拖来拖去,归根到底还是一个懒字吧 .发现人的惰性真是太强大了 ...
- Cocos2d-x项目移植到WP8系列之九:使用自定义shader
本文原链接:http://www.cnblogs.com/zouzf/p/3995132.html 有时候想得到一些例如灰度图等特殊的渲染效果,就得用到自定义shader,关于shader的一些背景知 ...
- Cocos2d-x项目移植到WP8系列之八:CCLabelTTF显示中文不换行
原文链接: http://www.cnblogs.com/zouzf/p/3985330.html 在wp8平台上,CCLabeTTF显示中文不会自动换行,看了下源码,原来底层的实现是根据text的空 ...
- Cocos2d-x项目移植到WP8系列之六:C#工程使用C++的DLL
原文链接: http://www.cnblogs.com/zouzf/p/3984510.html 此时,一些大问题都被解决后,整个工程基本能跑起来了,最后一个大问题是:业务层是用Lua开发的,底层的 ...
- Cocos2d-x项目移植到WP8系列之四:文件操作
原文链接: http://www.cnblogs.com/zouzf/p/3972457.html 读写文件Cocos已经用fopen fwrite来做好了,这里说的主要是文件和文件夹的创建.删除.判 ...
- Cocos2d-x项目移植到WP8系列之七:中文显示乱码
原文链接:http://www.cnblogs.com/zouzf/p/3984628.html C++和C#互调时经常会带一些参数过去例如最常见的字符串,如果字符串里有中文的话,会发现传递过去后变成 ...
- Cocos2d-x项目移植到WP8系列之五:播放MP3
原文链接: http://www.cnblogs.com/zouzf/p/3972549.html 这一块的细节还是不太了解,只是东凑西拼能跑起来而已 1.网上下载lamb库 生成需要的lib库,详情 ...
- Cocos2d-x项目移植到WP8小记
Cocos2d-x项目移植到WP8小记 作者: K.C. 日期: 10/24/2013 Date: 2013-10-24 00:33 Title: Cocos2d-x项目移植到WP8小记 Tags: ...
随机推荐
- c#文件路径的获取
string fullPath = @"\WebSite1\Default.aspx"; string filename = System.IO.Path.GetFileName( ...
- oracle高水位
oracle高水位http://www.cnblogs.com/chuyuhuashi/p/3548260.htmlhttp://blog.csdn.net/wyzxg/article/details ...
- 机器学习算法-Adaboost
本章内容 组合类似的分类器来提高分类性能 应用AdaBoost算法 处理非均衡分类问题 主题:利用AdaBoost元算法提高分类性能 1.基于数据集多重抽样的分类器 - AdaBoost 长处 泛化错 ...
- wpf数据绑定更新通知
类似于这样子的;大致的意思是:一个代码变量,通过改变变量的值,绑定这个变量的这个圆颜色也在变化 就是一种心跳效果 在网上数据触发的感觉不多,废了不少时间,这里做个总结 1:通知 class Notif ...
- C++中计算矩阵的行列式
使用eigen库: 求行列式: #include <iostream> #include <Eigen/Dense> using namespace std; using na ...
- gcc 编译 连接 生成可执行文件
gcc c语言编译器 g++ c++编译器 gcc a.c 生成默认的a.out 可执行文件 ./a.out 来执行 gcc -c a.c 编译生成 a.o 目标文件 可以检查语法错误 gcc ...
- 七牛上传ipa后自动生成plist文件
1.利用模板技术动态生成plist文件的内容:(模板内容和data替换为plist需要的内容) //artTemplate <script src="js/template.js&qu ...
- MVC路由自定义及视图找寻规则
这篇关于MVC路由及视图规则本来是昨天要发的,但是本人真的有点懒,终于今天忍无可忍了.初学MVC的时候比现在还菜一点(现在也很菜),想着会用就行,但是有时还是会好奇,为什么它能找到控制器?为什么控制器 ...
- 1400 序列分解(dfs)
1400 序列分解 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 小刀和大刀是双胞胎兄弟.今天他们玩一个有意思的游戏. 大刀给小刀准备了一个长度为n的整数序列.小 ...
- Balala Power!(大数+思维)
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...