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: ...
随机推荐
- laravel Lumen邮箱发送配置
Lumen 中配置邮件 https://blog.csdn.net/glovenone/article/details/54344013 Lareval 比 Lumen 多了一个步骤 https:// ...
- nginx 日志参数说明
$args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为 ...
- 使用Volley缓存图片时,缓存无效的原因。
使用Volley的ImageLoader异步获取并缓存图片时,发现有的网络图片已经缓存了,可是断网后却读不出来. ImageLoader的用法: RequestQueue requestQueue = ...
- Youth Is Not a Time of Life
Youth is not a time of life; it is a state of mind.青春不是年华,而是心境: It is not a matter of rosy cheeks, r ...
- [Docker]学习笔记--搭建gitlab
Gitlab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 详细介绍可以参照官网,https://about.gitlab.com/ 今天主要是通过 ...
- 巨蟒django之权限6: 权限控制表设计&&登录权限
1.权限控制表设计 内容 . 什么是权限? . 为什么要有权限? 不同用户拥有不同的功能 . 在web开发中,什么是权限? url 代表 权限 . 开发一个权限的组件,为什么要开发组件? . 表结构的 ...
- Storm 提交任务过程详解 (不对地方麻烦指正)
1.使用的是Storm中自带的一个测试jar包 提交下这任务到storm中去 storm jar /usr/local/app/storm/examples/storm-starter/storm-s ...
- python系列十一:python3数据结构
#!/usr/bin/python #Python3 数据结构'''Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能.''' '''将 ...
- Centos之常见目录作用介绍(九)
我们先切换到系统根目录 / 看看根目录下有哪些目录 [root@localhost ~]# cd / [root@localhost /]# ls bin dev home lib64 mn ...
- win8内置管理员账号既能使用metro应用又能使用默认共享
一.内置管理员账号打开METRO应用 1.按WIN+R 弹出运行框. 2.输入gpedit.msc点确定,打开本地组策略编辑器. 3.逐级选择“计算机配置”,“Windows 设置”,“安全设置”,“ ...