Cocos2d-x游戏移植到WP8之路 -- c++和c#交互

2023-11-05 15:20

本文主要是介绍Cocos2d-x游戏移植到WP8之路 -- c++和c#交互,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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上的截图例如以下所看到的:

1.jpg

1419561110799196.jpg

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#交互的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/350733

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝