MP3之痛 — Cocos2dx 游戏移植到 WP8 之路

Cocos2dx 是目前最流行的手机游戏引擎之一,开源、轻量、多平台等的诸多特性使得它被很多国内外手游开发者所喜爱。利用Cocos2dx来开发Windows Phone 8的游戏同样也是非常的方便高效。当然任何跨平台的游戏引擎,最终解决的都只能是游戏层面的问题:包括场景的管理、图形的渲染、真实物理世界的模拟等;要想真正在一个平台上把游戏做好,不可避免会遇到很多和平台相关的问题,需要我们每个游戏程序员对于该平台的技术有个比较深入的了解。在Windows Phone 8这个平台上,我希望通过自己的努力帮助大家解决移植过程中遇到的问题。 这一次我们来聊聊mp3音乐播放的问题。在游戏中播放音乐,大家一般使用Cocos2dx自带的CocosDenshion音乐引擎。使用方法相当简单,步骤如下: 工程中加入CocosDension引擎 (WP8的目录在cocos2d\cocos\audio\proj.wp8) WinRT工程加入CocosDension的库引用 代码中加入必要的H文件和namespace #include”SimpleAudioEngine.h” using namespace CocosDenshion; 播放BGM的代码 SimpleAudioEngine::sharedEngine()->playBackgroundMusic(“xxx”, true); 播放SE的代码 SimpleAudioEngine::sharedEngine()->preloadEffect(“xxx”); SimpleAudioEngine::sharedEngine()->playEffect(“xxx”);             (注1) 采用上述方法,我们可以很顺利地播放wav格式的音乐。但美中不足的是,因为版权的原因Windows Phone 8的平台上默认是不支持mp3格式音乐的播放的,所以CocosDenshion音乐引擎在WP8平台上对mp3格式的文件做了屏蔽。做一下如下试验:我们在上述代码中,把xxx替换为mp3音乐文件名,比如“spacegame.mp3”,运行后抛出如下异常:   抛异常的语句为mediaStreamer.cpp文件的Initialize函数:        ThrowIfFailed(ReadChunk(MAKEFOURCC(‘R’, ‘I’, ‘F’, ‘F’), chunkSize, chunkPos));        if (*reinterpret_cast<constDWORD *>(&dataPtr[chunkPos]) != MAKEFOURCC(‘W’, ‘A’, ‘V’, ‘E’)) ThrowIfFailed(E_FAIL);   从代码可以看出,CocosDenshion一开始就对mp3的文件进行了过滤,任何非wav的文件都会直接抛出异常。 如何解决这个问题呢?方法有二个。第一个最简单,就是修改资源本身。我们把mp3的格式转换为wav格式,网络上可以找到很多这样的工具。当然因为wav格式的文件体积比较大,所以这个方法不够完美。本文重点介绍第二个方法,也就是使用lamb库增加Windows Phone 8平台对于mp3的支持。 Lamb是目前使用最广泛的MP3编码器,大家可以访问官网获取更多信息: 链接地址: http://lame.sourceforge.net/download.php 使用Lamb所提供的解码模块,我们可以在WP8平台上实现mp3格式音乐的播放。我在这里借用一个网络上开源的代码: 链接地址: https://github.com/tianjing/lame_wp8…

3

轻松将HTML5 游戏迁移为Universal App 商店应用 (H5拓展为Windows Native 应用)

  随着HTML5 游戏快速流行和发展,很多HTML5 游戏开发者并不满足HTML5 游戏在微信和轻应用平台上的成功。迫切希望将游戏变为Native 应用发布的应用商店里。 目前流行的做法是 使用游戏引擎(Cocos2D-X, Unity3D)重新开发游戏 搭建一个极其简单应用框架,使用Webview 加载游戏。 第一种方法,显而易见,虽然充分利用native 应用特点使用了Offline 的功能,但是需要重新开发。又要学习新的引擎和开发语言,痛苦之处,不言而喻。 第二种方法,虽然简单,但是仍然无法逃避H5 非常依赖流量和网络状态的弊端。此外,有些应用商店都会拒绝这类应用的发布。 那么,HTML5 游戏开发者的福音来了。 是时候将你的H5 游戏轻松变为真正的 Windows Universal Apps 发布到Windows 和 Windows Phone 商店了。 这样我们就可以方便地支持Windows PC,平板,手机了。 下面我就揭晓这个过程。 首先,如果你还不了解什么是Windows和Windows Phone 商店应用,请参考 http://msdn.microsoft.com/library/windows/apps/dn726767.aspx 如果你打算发布应用,请注册开发者账户。 然后,请下载开发工具 http://dev.windows.com/zh-cn/develop/downloads  如果你还不了解什么是Windows Universal App, 请参考 http://dev.windows.com/zh-cn/develop/Building-universal-Windows-apps 请注意:在将你的H5 游戏迁移到Universal App 之前,请一定确保你的游戏在IE11 上没有任何的兼容性问题。 如果你没有IE11,可以使用 http://modern.ie (下载Browser Stack 和其他 free VMs)….

0

HTML5 开发新机遇活动总结!

在12月6日早上9:30到下午4:30,微软DX部门举办了《HTML5 开发新机遇》。这个活动准们为微软的网技术做了一系列的介绍。题目包含了: 移植 Web 应用到 Universal Apps WinJS 概述 TypeScript 的优势 用 Web App Template 来一直网站到 Universal Apps Internet Explorer 最新的工具 跨平台的 Visual Studio Tools for Apache Cordova 微软的 Azure 云计算 发布应用到 Windows 商店 如果大家对这个课程有兴趣,请下载 PDF 来学习。还有教课视频在 Microsoft Virtual Academy 可以在线学习。 Apache Cordova:http://www.microsoftvirtualacademy.com/training-courses/873 HTML5 开发 Universal Apps:http://www.microsoftvirtualacademy.com/training-courses/866 HTML5 游戏迁移到 Universal Apps 和 Egret 课程:http://www.microsoftvirtualacademy.com/training-courses/869  …

1

TTF中文乱码 — Cocos2dx 游戏移植WP8之路

Cocos2dx 是目前最流行的手机游戏引擎之一,开源、轻量、多平台等的诸多特性使得它被很多国内外手游开发者所喜爱。利用Cocos2dx来开发Windows Phone 8的游戏同样也是非常的方便高效。当然任何跨平台的游戏引擎,最终解决的都只能是游戏层面的问题:包括场景的管理、图形的渲染、真实物理世界的模拟等;要想真正在一个平台上把游戏做好,不可避免会遇到很多和平台相关的问题,需要我们每个游戏程序员对于该平台的技术有个比较深入的了解。在Windows Phone 8这个平台上,我希望通过自己的努力帮助大家解决移植过程中遇到的问题。 Cocos2dx的WP8项目在中文显示这一块,一直有些问题。虽然这算不上很严重的Bug,但也足以令不少开发者费神。因为这是所有面向国内市场的游戏开发者所无法回避的问题。我总结了一下,中文显示不出主要集中在大家使用CCLabeTTF显示TrueTypeFont的中文时,会发生二个症状:一是中文显示为方块,二是中文显示乱码。如下图所示:   显示方块   显示乱码   更麻烦的是,Cocos2dx自带的TestCpp也有同样的问题(注1)。 下面给出解决方案:   中文只显示方块的问题是由于CCTableTTF所指定的TTF字体在WP8下不支持中文,比如Marker Felt 或是Arial字体。解决的办法很简单,只要替换支持中文的字体即可。这里推荐大家使用arialuni.ttf (Arial Unicode MS) 或是Cocos2dx自带的HKYuanMini.ttf(我已上传arialuni.ttf字库供大家使用)。这里提醒大家需要把新添加的字库文件放到游戏工程的Resources\fonts目录下,并确保该字库文件打入XAP包中。代码的写法类似下面所示: auto label = LabelTTF::create(“梅颖广研究Cocos2dx”,”fonts/arialuni.ttf”,36);   如果出现中文乱码的情况,那就是字符编码不对的问题,这不是简单替换字库文件所能搞定的。大家所做的第一件事情,就是确认需要输出的中文是什么编码。如果大家是直接把输出的中文写在Visual Studio里,就像上述的那条语句一样,那就去查看一下Visual Studio编码方式。方法是打开File \ Advanced Save Option…菜单,弹出如下对话框。 一般可能会是三种编码方式:Unicode(UTF-8 without signature), Unicode(UTF-8 with signature), Chinese Simplified (GB2312)。其中UTF8 的signature的意思就是BOM (Byte Order Mark) ,带不带BOM的区别可以参考如下文章: 链接地址: http://gkecenter.blog.163.com/blog/static/18138030520129292491090/   当然大家可以通过上述对话框切换编码。Cocos2dx处理的必须是UTF8编码的字符,如果不符合的话就会显示乱码。除此之外我还发现,如果编码选择不好,在代码中直接插入中文的时候,中文字符会和后面的标点产生干涉,发生奇怪的编译错误。比如下面这句,究和右分号会产生错误。 auto label =…

0

双模块的交互 — Cocos2dx 游戏移植WP8之路

Cocos2dx 是目前最流行的手机游戏引擎之一,开源、轻量、多平台等的诸多特性使得它被很多国内外手游开发者所喜爱。利用Cocos2dx来开发Windows Phone 8的游戏同样也是非常的方便高效。当然任何跨平台的游戏引擎,最终解决的都只能是游戏层面的问题:包括场景的管理、图形的渲染、真实物理世界的模拟等;要想真正在一个平台上把游戏做好,不可避免会遇到很多和平台相关的问题,需要我们每个游戏程序员对于该平台的技术有个比较深入的了解。在Windows Phone 8这个平台上,我希望通过自己的努力帮助大家解决移植过程中遇到的问题。 从程序架构角度,首先需要向大家说明的是,目前Cocos2dx 3.2以下的版本生成的Windows Phone工程,主要是针对Windows Phone SilverLight 8.0的Framework;而最新8.1系统的Windows XAML App Framework则是3.3版本之后才会完美支持。目前程序的结构本质上就是带XAML应用的Direct3D的程序模型。工程在SolutionExplore上的截图如下所示:          Cocos2dx –WP8工程 Direct3D and XAML App 工程   可以看出,二者非常类似,均由二个部分组成。第一个部分是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层添加相应功能;而Cocos2dx的游戏逻辑一般放在C++的WinRT层,这样这二个模块之间的交互工作就必不可少。最简单的需求场景就是Cocos2dx发一个指令,调用XAML层的第三方SDK的某个功能。如何做到这一点呢?我给大家二个方案。   方案一:扩充Cocos2dEvent 前文提到,Direct3Dinterop类在二个模块之间扮演了交互的角色。所以,我们完全可以使用这个方法来实现自己的需求。具体做法如下: 1.  WinRT模块:在cocos2d\cocos\platform\winrt\InputEventTypes.h文件中增加新Event的定义(比如WeChat) publice num class Cocos2dEvent {    ShowKeyboard,    HideKeyboard,    TerminateApp,    WeChat//add new event };…

0

版本之惑 — Cocos2dx 游戏移植WP8之路

Cocos2dx 是目前最流行的手机游戏引擎之一,开源、轻量、多平台等的诸多特性使得它被很多国内外手游开发者所喜爱。由于其拥有众多的开发者和非常活跃的社区,Cocos2dx的版本更新一直比较快,所以一些团队和公司目前正在开发的主力产品很可能使用的是比较旧的版本。同时因为一些历史方面的原因,Cocos2dx目前处于2.x版本和3.x版本共存的局面。 Windows Phone8作为微软公司最新一代的手机操作系统正吸引越来越多的开发者包括使用Cocos2dx的游戏开发人员把作品往这个平台上迁移。那么在迁移过程中遇到的首要问题就是大家目前所使用的Cocos2dx的版本是否支持Window Phone8,能支持到什么程度? 下表是我对各个版本的Cocos2dx在Windows Phone8平台上的支持情况的简单梳理,供大家参考: 版本号 支持情况 移植建议 ≤ 2.1 不支持WP8平台 升级高版本 2.2 支持8.0SilverLight,不支持混合模式 升级高版本 2.2.1 支持8.0SilverLight 有错误,修正后使用 ≥2.2.2 支持8.0SilverLight 直接使用,尽量使用高版本 3.0 支持8.0SilverLight 编译有错,升级高版本 3.1 支持8.0SilverLight 编译有错,修正后使用 3.2 支持8.0SilverLight 直接使用 3.3 支持8.1UniversalApp 等待近期发布,最完美版本 从上表可以看出,要想用Cocos2dx引擎开发Windows Phone8的游戏,建议大家使用2.2.3和3.2之后的版本。当然只有最近马上要发布的3.3版本才是真正使用到了Windows Phone8.1的功能。 最后对于CocosStudio和Cocos2dx的版本对应情况,参考了 CocoaChina 社区的相关技术文档,这里也给大家罗列一下,谢谢! Cocos2dx CocosStudio 2.2.6 3.2 1.6.0.0 2.2.5 3.2 RC0 1.5.0.1 2.2.4   1.5.0.0 2.2.3 3.0 release,…

0

如何将 Unity3D 游戏移植到 Universal Apps

你是不是用 Unity 引擎来开发 iOS 或者 Android 的游戏? 如果你不知道,Unity 都可以开发 Windows Phone 8.0 / 8.1, Windows Store Apps 8.0 / 8.1, 和 Universal Apps。 移植你的游戏到微软开发平台是免费支持,不需要买 Unity Pro licenses 。以下的链接可以让开发者多了解移植过程。我会从 Unity 的 Build Settings 构建一个Windows, Windows Phone, 或 Universal Apps 的版本。我会带着大家来更改硬件的问题,例如:分辨率,内存,纹理,键盘,等等。我会让大家了解 .NET API 的差别在哪里,然后介绍几个方案来解决问题: 方案: Unity插件, 例子:Github Unity Porting Lab Plugins Action (void delegate), 例子: WindowsGateway.cs Global instances,…

0

在Windows平台如何移植OpenGL ES应用和游戏?

有很多开发者在移植应用或者游戏到Windows Store或者Windows Phone时都有这样的困惑。大家知道在Windows的桌面应用中,OpenGL是支持的,有些游戏就同时支持DirectX和OpenGL两种渲染模式。 但是在Windows Store或者Windows Phone Store中,只能使用DirectX 11的API,而不支持DirectX 9/10的API,也不支持直接使用OpenGL/OpenGL ES的API。   那么,有没有办法可以快速的实现移植呢?答案是Yes。在微软MS Open Tech的努力下,Angle Project目前可以支持Windows Store和Windows Phone了,事实上,非常流行的游戏引擎cocos2d-x就使用这一开源项目完成了在Windows平台的移植。 关于Angle Project对Windows支持的更多信息,请参考下面的链接: https://github.com/MSOpenTech/angle   当然,开发者也可以对比OpenGL ES和DirectX 11的API, 逐步实现转换。