zoukankan      html  css  js  c++  java
  • 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文件如下:

     1 class  WZCallCS_And_BackToLua_Image
     2 {
     3 public:
     4 
     5     static WZCallCS_And_BackToLua_Image* Share_GetInstance();
     6         
     7     void (*FunCallCS_ImageCropper)();//在CX里被实现为调用CS的方法
     8 
     9 private:
    10 
    11     static WZCallCS_And_BackToLua_Image* m_pInstance;
    12 
    13     WZCallCS_And_BackToLua_Image();
    14     ~WZCallCS_And_BackToLua_Image();
    15 
    16     //把复制构造函数和=操作符也设为私有,防止被复制,只声明不实现,为什么?
    17     WZCallCS_And_BackToLua_Image(const WZCallCS_And_BackToLua_Image&);
    18     WZCallCS_And_BackToLua_Image& operator=(const WZCallCS_And_BackToLua_Image&);
    19 
    20 };


     

    还记得winRT组件工程里的那个能被C#访问的类吧,那个类里有一个setCallback 方法,实现改为如下:

     1 void WZCallCS_And_BackToCX_Image::setCall_FromCXToCS(ICallCS_And_BackCX_Image^ callback)
     2 {
     3     globalCallCS = callback;
     4 
     5     WZCallCS_And_BackToLua_Image *callCS = WZCallCS_And_BackToLua_Image::Share_GetInstance();
     6     
     7     callCS->FunCallCS_ImageCropper =  [] ()
     8     {
     9         globalCallCS->getPictureFromPhotos("");
    10     };
    11 }

    在这里给 单例类的函数指针 一个实现,让函数指针指向一个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

  • 相关阅读:
    2017.7.27
    js 变量那些事
    JS初学之-效果没出来怎么办?-alert函数测试
    JS初学之-循环生成坐标
    JS初学之-if else图片顺序及循环切换
    JSP笔记与案例一览(JSP后半部分)
    Java基础一览(会不断补充)
    session和cookie一览
    request和response一览
    封装含义一览
  • 原文地址:https://www.cnblogs.com/zouzf/p/3971021.html
Copyright © 2011-2022 走看看