21 第21 章 从win32 到windows phone8 -...

23
Cocos2d-x 多平台移植详解 21 21 Win32 Windows Phone8 21.1 Windows Phone 8 开发环境搭建 开发 Windows Phone 需要两个工具: Windows Phone SDK 8.0 和 Visual Studio 集成开发工具我们购买的 Visual Studio Ultimate 2012 不包括 Windows Phone SDK,由于 Visual Studio Ultimate 2012 是收费软件,如果广大读 者没有授权,也可以使用 Visual Studio Express 2012 for Windows Phone 8。 我们推荐的做法是如果有 Visual Studio Ultimate 2012 版本,先安 装 Visual Studio Ultimate 2012,再安装 Windows Phone SDK如果没有 Visual Studio Ultimate 2012 版本,直接下载 Visual Studio Express 2012 for Windows Phone 8 安装,Visual Studio Express 2012 for Windows Phone 8 环境中包含了 Windows Phone SDK 8.0。 21.1.1 Windows Phone SDK 8.0 安装 Windows Phone SDK 8.0

Upload: others

Post on 22-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

Cocos2d-x 多平台移植详解

21 第 21 章 从 Win32 到 Windows Phone8

21.1 Windows Phone 8 开发环境搭建

开发 Windows Phone 需要两个工具:Windows Phone SDK 8.0 和

Visual Studio 集成开发工具。

我们购买的 Visual Studio Ultimate 2012 不包括 Windows Phone

SDK,由于 Visual Studio Ultimate 2012 是收费软件,如果广大读

者没有授权,也可以使用 Visual Studio Express 2012 for Windows

Phone 8。

我们推荐的做法是如果有 Visual Studio Ultimate 2012 版本,先安

装 Visual Studio Ultimate 2012,再安装 Windows Phone SDK。

如果没有 Visual Studio Ultimate 2012 版本,直接下载 Visual

Studio Express 2012 for Windows Phone 8 安装,Visual Studio

Express 2012 for Windows Phone 8 环境中包含了 Windows

Phone SDK 8.0。

21.1.1 Windows Phone SDK 8.0 安装

Windows Phone SDK 8.0 的 下 载 地 址 是

Page 2: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

http://www.microsoft.com/zh-

cn/download/details.aspx?id=35471.

21.1.2 Visual Studio Express 2012 for Windows Phone 8 安装

如果没有 Visual Studio Ultimate 2012 也不打算花钱购买,那么微

软 给 了 另 外 一 个 选 择 , 安 装 Visual Studio Express 2012 for

Windows Phone 8,Visual Studio Express 2012 是一个免费版本

的 Visual Studio 集成开发环境,我们只是为了开发和发布 Windows

Phone 8 程序,Visual Studio Express 2012 for Windows Phone

8 就可以了。

我 们 在 上 一 节 下 载 的 WPexpress_full.exe 文 件 , 在 安 装

WPexpress_full.exe 时候,如果本机没有安装任何的 Visual Studio

开发工具,则会在线安装 Visual Studio Express 2012 for Windows

Phone 8。

Visual Studio Express 2012 for Windows Phone 8 的安装过程除

了安装 Windows Phone SDK 8.0,还会安装测试 Windows Phone

8 模 拟 器 ( 或 称 为 仿 真 器 )、 Windows Phone Developer

Registration 和 Application Deployment 等工具。

Page 3: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

Windows Phone 应用程序包 XAP 文件安装:

Application Deployment 工具是为 Windows Phone 应用程序包

XAP 文件,进行部署安装的,可以在设备或模拟器上安装。XAP 相

当于 Android 的 APK 包。Application Deployment 工具启动后的

界面如图 22-4 所示,我们可以在“目标”中选择要部署到的设备或

模拟器。XAP 后面的“浏览”按钮可以在本机上找 XAP 文件,选择

完成后点击“部署”按钮进行部署安装。

图 22‑4 Application Deployment 工具

Page 4: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

Windows Phone 模拟器启动

21.1.3 Windows Phone 设备解锁

Windows Phone 设备解锁:

Windows Phone Developer Registration 工具是为 Windows

Phone 设备解锁使用的工具,默认情况下 Windows Phone 设备是

不能直接连接电脑进行测试和部署应用的,需要通过该工具进行解锁

(见图 22-3 所示),在解锁时候需要还需要微软的开发者账号。

Page 5: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

图 22‑3 设备解锁

21.1.4 Windows Phone 应用程序包 XAP 文件安装

Windows Phone 应用程序包 XAP 文件安装:

Application Deployment 工具是为 Windows Phone 应用程序包

XAP 文件,进行部署安装的,可以在设备或模拟器上安装。XAP 相

当于 Android 的 APK 包。Application Deployment 工具启动后的

界面如图 22-4 所示,我们可以在“目标”中选择要部署到的设备或

模拟器。XAP 后面的“浏览”按钮可以在本机上找 XAP 文件,选择

完成后点击“部署”按钮进行部署安装。

Page 6: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

图 22‑4 Application Deployment 工具

21.1.5 Windows Phone 模拟器启动

Windows Phone 8 模拟器要求 Windows 8 专业版或更高版本,需

要支持二级地址转换 (SLAT) 的 CPU。如果我们的计算机满足硬件

和操作系统要求,但不满足 Windows Phone 8 模拟器要求,那么

我们仍然可以安装和运行 Windows Phone SDK 8.0。只不过

Windows Phone 8 模拟器将无法工作,我们无法在 Windows

Page 7: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

Phone 8 模拟器上测试和部署应用,这种情况下可以连接 Windows

Phone 设备进行测试。

21.2 Cocos2d-x 3.x 的 Windows Phone 8 工程

21.2.1 生成工程

cocos new 指令生成。

21.2.2 运行工程

21.2.3 调试工程

Cocos2d-x 中的 log 也不能输出。

21.3 移植问题汇总

21.3.1 中文乱码问题

中文乱码在 Windows Phone 8 是个大问题,我们来讨论整个问题。

在 Windows Phone 8 平台中文乱码问题与 Win32 平台产生的原因

是相同的,都是由于在 Visual Studio 生成的源代码文件 GBK 编码,

而输入输出的中文字符是 UTF-8 编码。

我们有两种方法解决问题:

一种是保持源代码文件是 GBK 编码,然后使用第 14 章提供的

Page 8: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

MyUtility::gbk_2_utf8(const string text)函数将要中文字符串转为

UTF-8 编码;

另一种是将源代码文件另存为 Unicode(UTF-8 无签名)格式,这种解

决方案会有一些问题,在使用 Visual Studio 编译的时候会报警或

error C2001 编译错误(参见 14.5.7 一节),因此在 Windows Phone

8 平台中文乱码问题比较的好解决方法还是前一种。

我们在第 14 章介绍过通过微软提供 WideCharToMultiByte 函数实

现,并且定义了 MyUtility::gbk_2_utf8(const string text)函数,它

能够在 Win32 和 Windows Phone 8 平台下将 gbk 编码转化成 utf8

编码。由于使用了 WideCharToMultiByte 函数,它只能在微软平台

使用,因此需要进行条件编译,在 MyUtility.cpp 代码如下:

string MyUtility::gbk_2_utf8(const string text)

{

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 ||

CC_TARGET_PLATFORM == CC_PLATFORM_WP8) ||

(CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)

//采用 Lambda 表达式,将 string 转换成 wstring

Page 9: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

wstring tes = [=]() {

setlocale(LC_ALL, "chs");

const char* _Source = text.c_str();

size_t _Dsize = text.size() + 1;

wchar_t *_Dest = new wchar_t[_Dsize];

wmemset(_Dest, 0, _Dsize);

mbstowcs(_Dest,_Source,_Dsize);

std::wstring result = _Dest;

delete []_Dest;

setlocale(LC_ALL, "C");

return result;

}();

int asciSize =

WideCharToMultiByte(CP_UTF8,0,tes.c_str(),tes.size(),NULL,0,N

ULL,NULL);

Page 10: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

if (asciSize == ERROR_NO_UNICODE_TRANSLATION ||

asciSize == 0)

{

return string();

}

char *resultString = new char[asciSize];

int conveResult =

WideCharToMultiByte(CP_UTF8,0,tes.c_str(),tes.size(),

resultString,asciSize,NULL,NULL);

if (conveResult != asciSize)

{

return string();

}

string buffer = "";

buffer.append(resultString,asciSize);

Page 11: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

delete[] resultString;

return buffer;

#else

return text;

#endif

}

具体使用的时候也进行条件编译,代码如下:

int NoteDAO::create(string pDate, string pContent)

{

… …

sqlite3_bind_text(statement, 1, pDate.c_str(), -1, NULL);

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 ||

CC_TARGET_PLATFORM == CC_PLATFORM_WP8) ||

(CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)

Page 12: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

//字符转换,使 cocos2d-x 在 win32、wp8 平台支持中文显

pContent = MyUtility::gbk_2_utf8(pContent);

#endif

sqlite3_bind_text(statement, 2, pContent.c_str(), -1,

NULL);

… …

}

通过 MyUtility::gbk_2_utf8 函数的转换 GBK 变成了 UTF-8 编码,

我们可以将这些中文字符保存到 JSON、XML 等文本文件或插入到

数据库中,但是要注意文本文件和数据库都要采用 UTF-8 编码。另

外,在网络上传输中文字符默认也是采用 UTF-8 的。

21.3.2 SQLite3 数据库移植问题

Windows Phone 8 平 台 中 原 生 数 据 库 是 微 软 的 SQL Server

Compact,SQL Server Compact 是一个针对开发人员而设计的免

费嵌入式数据库,它可以在移动设备、桌面和 Web 客户端应用使用。

但是在 Cocos2d-x 中使用 Windows Phone 8 系统原生的 SQL

Page 13: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

Server Compact 就会很麻烦。如果数据量比较小我建议采用 JSON

或 XML 等数据持久化方式保存数据,如果数据量比较大建议移植

SQLite3 到 Windows Phone 8 平台。

Cocos2d-x 中 SQLite3 库不能给 Windows Phone 8 平台使用。我

们也不能采用 Android 的移植方法,直接把 SQLite3 的源程序代码

进行交叉编译 Windows Phone 8 平台。幸运的是 SQLite 官方给我

们提供了针对 Windows Phone 8 平台预编译的运行环境,在浏览

器中输入地址 https://sqlite.org/download.html,进入如图 22-11

所 示 的 SQLite 下 载 页 面 , 我 们 在 此 选 择 sqlite-wp80-winrt-

3080403.vsix 文件下载。

安装完整之后,我们就可以在 Cocos2d-x 的工程中配置环境了,打

开 Cocos2d-x 的 Windows Phone 8 工程进入 Visual Studio 的解

决方案后,选中 HelloCppComponent 工程右键选择“引用”菜单,

打开引用对话框,如图 22-13 所示。

Page 14: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

图 22‑13 引用对话框

在引用对话框中选择“通用属性”→“框架和引用”,点击右边“添加

新引用”按钮,弹出添加引用对话框,如图 22-14 所示,我们选择

Windows Phone→扩展→SQLite for Windows Phone,然后点击

确定按钮关闭对话框,回到图 22-15 所示的添加引用 SQLite.WP80

成功对话框。

Page 15: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

图 22‑14 添加引用对话框

图 22‑15 添加引用成功

Page 16: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

添加引用成功后我们就在程序中使用 SQLite3 API 访问 SQLite3 数

据代码了,具体使用的时候需要引入头文件<sqlite3.h>而不是

"sqlite3.h",如果考虑其它的平台我们可以在头文件引入的时候采用

条件编译,代码如下:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) ||

(CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)

#include <sqlite3.h>

#else

#include "sqlite3.h"

#endif

21.3.3 框架 rapidjson 移植问题

选中 HelloCppComponent 工程,打开菜单“项目”→“属性”弹

出工程属性对话框,如图 22-16 所示,选择“配置属性”→“C++”

→ “ 常 规 ”, 在 右 边 的 “ 附 加 包 含 目 录 ” 中 添 加

$(EngineRoot)external\json,注意配置项目之间需要用分号分隔开。

Page 17: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

图 22‑16 配置 json 路径

21.3.4 libcurl 库移植问题

配置头文件搜索路径

配置链接环境

添加动态链接库

1、配置头文件搜索路径

$(EngineRoot)external\curl\include\wp8

Page 18: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

2、配置链接环境

选择“配置属性”→“连接器” →“常规”,在右边的“附加包含目

录”中添加$(EngineRoot)external\curl\prebuilt\wp8\$(Platform).

接下来我们配置附加依赖项。打开工程属性对话框,如图 22-18 所

示,选择“配置属性”→“连接器” →“输入”,在右边窗口的“附

加依赖项”,添加内容 libcurl.lib。

图 22‑18 配置附加依赖项

在路径中的$(Platform)宏,它代表 arm 或 win32,arm 中的文件是

为 Windows Phone 8 设备调试和部署准备,而 win32 中的文件是

Page 19: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

为在 PC 上运行 Windows Phone 8 模拟器调试准备的。

3、添加动态链接库

这 些 库 文 件 也 是 在

$(EngineRoot)external\curl\prebuilt\wp8\$(Platform)目录下面,

我 们 根 据 运 行 的 平 台 添 加 它 们 。 具 体 步 骤 是 , 选 中

HelloCppComponent 工程右键菜单选择“添加”→“现有项”,打

开 添 加 项 目 对 话 框 , 如 图 22-19 所 示 , 找 到

$(EngineRoot)external\curl\prebuilt\wp8\$(Platform)实 际 的 目

录,选择文件 libcurl.dll、libeay32.dll 和 ssleay32.dll 文件,选择好

后点击“添加”按钮进行添加。

Page 20: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

图 22‑19 添加项目对话框

21.3.5 libNetwork 库移植问题

Cocos2d-x 提 供 了 libNetwork 库 的 源 代 码 , 而 且 还 提 供 了

libNetwork 库 的 源 代 码 Visual Studio 2012 工 程 文 件

libNetwork.vcxproj,这样就更方便移植了。

提 示 有 的 Cocos2d-x 工 程 模 板 在 解 决 方 案 中 , 已 经 有

libNetwork 库了,本节所介绍的过程就不需要了。

由于 libNetwork 库底层是依赖 libcurl 库,所以我们先要按照上一

节介绍的步骤移植 libcurl 库,这个过程不在介绍。下面我们移植

libNetwork 库,具体步骤是:在解决方案中添加 libNetwork 库工

程和添加 libNetwork 库引用。

Page 21: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

21.3.6 横屏与竖屏设置问题

首 先 我 们 还 需 要 修 改 HelloCppComponent 工 程 中 的

Direct3DInterop.cpp 文件中的 HRESULT Direct3DInterop::Draw

方法,代码如下:

HRESULT Direct3DInterop::Draw(_In_ ID3D11Device1* device,

_In_ ID3D11DeviceContext1* context, _In_

ID3D11RenderTargetView* renderTargetView)

{

std::lock_guard<std::mutex> guard(mRenderingMutex);

Page 22: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给

m_renderer->UpdateDevice(device, context,

renderTargetView);

#if 0

if(mCurrentOrientation != WindowOrientation)

{

mCurrentOrientation = WindowOrientation;

m_renderer->OnOrientationChanged(mCurrentOrientati

on);

}

#endif // 0

ProcessEvents();

m_renderer->Render();

RequestAdditionalFrame();

return S_OK;

}

Page 23: 21 第21 章 从Win32 到Windows Phone8 - 51CTOs2.51cto.com/wyfs02/M01/48/09/wKiom1QFcE7APOQTAA-n-GQhfQc… · SQLite3 到 Windows Phone 8 平。 Cocos2d-x. 中 SQLite3 库不能给