Cocos2d-x项目移植到WP8小记
Cocos2d-x项目移植到WP8小记
10/24/2013
Date: 2013-10-24 00:33
Title: Cocos2d-x项目移植到WP8小记
Tags: Android, adb, WP, Visual Studio
Cocos2d-x v2.2已经支持了Windows一系列的系统(cocos2d-x 0.13那个除外啦),包括RT,x86以及WP8
创建工程用create_project.py命令,工程会建立在cocos2d-x目录下的projects子目录中。
移植之前如果你的源文件中有中文,在vs 2012中编译可能会出现许多莫名其妙的错误,诸如类型未定义、变量未定义 warning C4819: The file contains a character that
cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss 之类的问题,但是在编辑器中是正常的。解决方法,选中有问题的文件,ctrl-A全选所有文本,File->Advanced Saved Options…对话框中选择 Unicode – Codepage 1200,或者 Unicode
(UTF-8 with signature) – Codepage 65001 保存,建议优先尝试后者。做完第三步之后,可能会发现中文无法识别,我不清楚有多少人会遇到这个问题,但是在将Eclipse(Linux上的开发环境,非Windows)和XCode上做好的代码移植到Windows+Visual Studio的时候,我发现我的代码中(甚至是注释中)的中文字符会导致无法编译,错误信息很奇怪的,比如告诉你哪个位置少了分号,某个变量缺少类型之类的根本不存在的错误。
这个绝对是编码问题,和代码逻辑无关。为了解决这个问题,文件中尽量少出现中文符号(如果从头开始就是在VS上写代码不知道是不是会有这样的问题,移植的代码,问题会更多)。同时也为了国际化,我们可以把游戏中需要出现的文案抽取出来,可以参考Android的方式来做国际化,将中文放到配置文件上(配置文件编码确保和CCLabelBMFont所使用的fnt文件的编码相同,一般使用Unicode
(UTF-8 without signature) – Codepage 65001 编码)。这样配置文件不参与编译,就可以避免编译期间中文编码扰乱编译过程这个问题。(这个问题上卡了我两天 ~_~ )引入其他工程,请注意引入工程依赖之后,你还需要将需要include的头文件配置到工程属性中,在这里:右键点击你的工程名->Properties->Configuration Properties->C/C++->Addtional
Include Directories 中加入响应的头文件所在的位置。例如对于声音依赖工程CocosDenshion的头文件在这里 $(ProjectDir)..\..\..\CocosDenshion\include ;而对于extionsion则在这里: $(ProjectDir)..\..\..\extensions关于导入Classes目录中的子目录,目前没有发现能用的好办法,一个一个建立Filter,然后往Filter中添加sources吧.
错误信息: *error C2440: ‘type cast’ : cannot convert from ‘void (__cdecl XXXX::* )(void)’ to ‘cocos2d::SEL_MenuHandler’*
解决方法,可能是函数原型不对,看看菜单的回调函数原型是不是这样的(检查一下是不是你少了参数?):
C++ Code:void HelloWorld::doClick1(CCObject* pSender);其他类似的情形也一样,你可以留意一下这几个函数的原型,它们定义在 CCObject.h 中:
C++ Code:typedef void (CCObject::*SEL_SCHEDULE)(float);
typedef void (CCObject::*SEL_CallFunc)();
typedef void (CCObject::*SEL_CallFuncN)(CCNode*);
typedef void (CCObject::*SEL_CallFuncND)(CCNode*, void*);
typedef void (CCObject::*SEL_CallFuncO)(CCObject*);
typedef void (CCObject::*SEL_MenuHandler)(CCObject*);
typedef void (CCObject::*SEL_EventHandler)(CCEvent*);
typedef int (CCObject::*SEL_Compare)(CCObject*);提示资源文件找不到?选中问题资源,点属性,然后把 Content 属性设置为true即可。
没有声音?建议使用wav资源。。体积那是相对其他格式要大一点的。。
最棘手的问题:cocos2d-x 2.2中的CCScrollView和CCTableView存在bug,导致整个屏幕图像会变形。论坛上已有用户反馈,我自己也有回帖,但估计WP开发者相对弱势,这个问题并没有得到解决。折腾了几天之后得到了解决方法,修改CCScrollView.cpp替换一下函数:
C++ Code:/**
* clip this view so that outside of the visible bounds can be hidden.
*/
void CCScrollView::beforeDraw()
{
if (m_bClippingToBounds)
{
m_bScissorRestored = false;
CCRect frame = getViewRect();
if (CCEGLView::sharedOpenGLView()->isScissorEnabled()) {
m_bScissorRestored = true;
m_tParentScissorRect = CCEGLView::sharedOpenGLView()->getScissorRect();
//set the intersection of m_tParentScissorRect and frame as the new scissor rect
if (frame.intersectsRect(m_tParentScissorRect)) {
float x = MAX(frame.origin.x, m_tParentScissorRect.origin.x);
float y = MAX(frame.origin.y, m_tParentScissorRect.origin.y);
float xx = MIN(frame.origin.x+frame.size.width, m_tParentScissorRect.origin.x+m_tParentScissorRect.size.width);
float yy = MIN(frame.origin.y+frame.size.height, m_tParentScissorRect.origin.y+m_tParentScissorRect.size.height);
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
glScissor((GLint)x, (GLint)y, (GLsizei)xx-x, (GLsizei)yy-y);
#else
CCEGLView::sharedOpenGLView()->setScissorInPoints(x, y, xx-x, yy-y);
#endif
}
}
else {
glEnable(GL_SCISSOR_TEST);
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
glScissor((GLint)frame.origin.x, (GLint)frame.origin.y, (GLsizei)(frame.size.width), (GLsizei)(frame.size.height));
//glDisable(GL_SCISSOR_TEST);
#else
CCEGLView::sharedOpenGLView()->setScissorInPoints(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
#endif
}
}
}实际使用我新建了名为HTScrollView和HTTableView两个类,代码引用到这两个新建的类上,避免直接更改框架代码。当然上面代码使用了宏预编译,直接修改框架代码也不会影响到Android和iOS。(我只发现原cocos2d-x-2.2框架在WP8下有此bug,至于WinRT下是否也有此问题并未测试。)CCScrollView.cpp做修改以后,CCTableView的问题也会得到解决。
关于CCLOG日志无输出的问题:
在Android中,要在Android.mk文件中添加以下编译选项: APP_CPPFLAGS := -DCOCOS2D_DEBUG=1
在VC++中的编译器不是gcc,而应该在Visual Studio设置: Your Project -> Settings -> Configuration Properties -> C/C++ -> Command
Line -> Additional Options 输入框中添加定义: /D “COCOS2D_DEBUG=1″,重新编译即可。当你决定发布Release版本的时候,请把这个去掉。关于WP8返回物理按键的响应,另文总结。
提交市场的时候出现错误:

1028: The native API api-ms-win-core-debug-l1-1-1.dll:OutputDebugStringA() isn’t allowed in assembly libcocos2d.dll. Update it and then try again. 1028: The native API api-ms-win-core-synch-l1-2-0.dll:CreateMutexExA() isn’t allowed in assembly libcocos2d.dll. Update it and then try again. 1028: The native API api-ms-win-core-synch-l1-2-0.dll:CreateEventExA() isn’t allowed in assembly libGLESv2_phone.dll. Update it and then try again.记得提交到MarketPlace一定要打成Release包,这里是两个问题:
1) 在libcocos2d工程中,将platform/winrt/CCCommon.cpp中的 CCLuaLog(const char *pszMsg) 方法的 OutputDebugStringA(“\n”); 注释掉或者加入预编译使得Release版本不出现。
2) 有人说可以使用c++11中的mutex替代,但我直接注释掉了。两处地方:
- 修改文件: cocos2dx/platform/winrt/CCWinRTUtils.h 中的 inline
void pthread_mutex_init(pthread_mutex_t* m, void* attributes) 方法注释掉内容。
- 修改文件:cocos2dx/platform/third_party/winrt/angleproject/src/third_party/winrt/
ThreadEmulation/ThreadEmulation.cpp 中的 _Use_decl_annotations_ VOID WINAPI Sleep(DWORD dwMilliseconds) 方法,注释掉内容。
- 修改文件: cocos2dx/platform/winrt/CCWinRTUtils.h 中的 inline
Release版本无声音,在 CocosDenshion/wp8/Audio.cpp 中注释此行:
m_soundEffects[sound].m_soundEffectSourceVoice->SetVolume(m_soundEffctVolume);如图:

关于内购:
WP8完美支持C++,所以内购其实很简单。
对于Consumable产品,可以用IsConsumable来加以判断,当然你设置产品属性的时候可能已经知道类型,这里可以可以免于判断了。重要的是使用IsActive判断用户是否计费成功。记得给用户发放道具之后,要调用以下方法来向服务器汇报,否则你将无法继续下次计费。
C++ Code:CurrentApp::ReportProductFulfillment(productId);对于Durable类型产品,使用IsActive判断计费成功后,直接给用户反馈即可,无需向服务器汇报。调用 ReportProductFulfillment(productId) 方法是会抛出异常的。切记。
链接错误,提示找不到extension或者CocosDenshion的库:
Error 204 error LNK2001: unresolved external symbol "public: __cdecl cocos2d::extension::CCBReader::CCBReader(class
cocos2d::extension::CCNodeLoaderLibrary *,class cocos2d::extension::CCBMemberVariableAssigner *,class cocos2d::extension::CCBSelectorResolver *,class cocos2d::extension::CCNodeLoaderListener *)" (??0CCBReader@extension@cocos2d@@QAA@PAVCCNodeLoaderLibrary@12@PAVCCBMemberVariableAssigner@12@PAVCCBSelectorResolver@12@PAVCCNodeLoaderListener@12@@Z)尝试解决方案->属性中指定游戏的依赖,添加libExtension和CocosDenshion两个项目,另外还需要在游戏项目的属性->框架和引用页面里添加上对libExtension和CocosDenshion两个项目引用的依赖
分辨率适配。
参考
- 如何建立Cocos2d-x
WP8开发环境 - Cocos2d-x
for WinRT的github源代码 - Cocos2d-x源代码
- Cocos2d-x
wiki文档 - how
to import lib projects to cocos2d-x wp8 solution:这篇的方法还是有点问题,需要和本文上面刚提到的第五点结合,才能正常编译工程。 - CCTableView的上级容器缩放时显示区域错误的问题
- cocos2d-x多分辨率自适配及因此导致的CCListView的bug修复
- Report
bug for CCScrollView - Windows
Phone 8 Games – Migrating from XNA to DirectX - Porting
Cocos2d-x Games for Windows Phone 8
Cocos2d-x项目移植到WP8小记的更多相关文章
- Cocos2d-x项目移植到WP8系列之三:C++和C#的交互
原文链接: http://www.cnblogs.com/zouzf/p/3971021.html 上一篇提到工程使用 XAML 和 Direct3D 项目模板 是因为要涉及到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库,详情 ...
随机推荐
- 《OD学hadoop》第一周0625
一.实用网站 1. linux内核版本 www.kernel.org 2. 查看网站服务器使用的系统 www.netcraft.com 二.推荐书籍 1. <Hadoop权威指南> 1- ...
- URAL1133. Fibonacci Sequence(二分)
1133 刚开始还用记忆化推了下公式 后来发现数是非常大的 二分 然后就是精度错误 中间值会很大 乱七八糟的改 #include <iostream> #include<cstdio ...
- 【笨嘴拙舌WINDOWS】设备无关图(*.bmp)
设备无关图在windows上面就是一个扩展名为.bmp的文件.我们知道每一种文件都是一个二进制流,只是这个二进制流的开头几个字节是规定了文件的格式..bmp的文件格式如下 “其中信息头是windows ...
- init: sys_prop: permission denied uid:1003 name:service.bootanim.exit
/************************************************************************* * init: sys_prop: permiss ...
- HDU 5348 MZL's endless loop 给边定向(欧拉回路,最大流)
题意: 给一个所有你可能想得到的奇葩无向图,要求给每条边定向,使得每个点的入度与出度之差不超过1.输出1表示定向往右,输出0表示定向往左. 思路: 网络流也是可以解决的!!应该挺简单理解的.但是由于复 ...
- AIX 第2章 指令记录
root@db:/#mount node mounted mounted over vfs date options ------- ...
- 【解题报告】POJ-1108 Split Windows
原题地址:http://poj.org/problem?id=1108 ============================== 题目大意: 一棵树表示一个窗口,它的叶子节点都是大写字母,非叶子节 ...
- IP碎片原理:攻击和防护
为了加深理解IP协议和一些DoS攻击手段大家有必要看看以下内容,也许对你理解这个概念有所帮助.先来看看IP碎片是如何产生的吧. 一.IP碎片是如何产生的 链路层具有最大传输 ...
- Vagrant使用笔记
vagrant box add [options] <name, url, or path> - 添加box至vagrant的管理列表 vagrant init 初始化虚拟机至当前文件夹并 ...
- 删除github.com上repository(仓库)的方法
第一步:打开http://github.com,看到右侧仓库列表.第二步:假设要删除“HiTop”这个参考,点击对应仓库进入详细页面之后,在右侧会看到“Settings”入口. 第三步:进入设置页面之 ...