Cocos2d-x项目移植到WP8小记

Cocos2d-x项目移植到WP8小记,第1张

概述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子目录中。 移植之前如果你的源

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中:

typedef ::*SEL_SCHEDulE)(float);SEL_CallFunc)();SEL_CallFuncN)(CCNode*);SEL_CallFuncND*,voIDSEL_CallFuncOSEL_MenuHandlerSEL_EventHandlerCCEventintSEL_Compare

提示资源文件找不到?选中问题资源,点属性,然后把Content属性设置为true即可。

没有声音?建议使用wav资源。。体积那是相对其他格式要大一点的。。

最棘手的问题:cocos2d-x 2.2中的CCScrollVIEw和CCtableVIEw存在BUG,导致整个屏幕图像会变形。论坛上已有用户反馈,我自己也有回帖,但估计WP开发者相对弱势,这个问题并没有得到解决。折腾了几天之后得到了解决方法,修改CCScrollVIEw.cpp替换一下函数:

/** * clip this vIEw so that outsIDe of the visible bounds can be hIDden. */CCScrollVIEwbeforeDraw(){if(m_bClipPingToBounds) m_bScissorRestored =false;CCRect frame getVIEwRect();CCEGLVIEwsharedOpenGLVIEw()->isScissorEnabled())true m_tParentScissorRect getScissorRect //set the intersection of m_tParentScissorRect and frame as the new scissor rectframe.intersectsRectm_tParentScissorRect))float x MAXoriginx,0)"> m_tParentScissorRect y y xx MIN+sizewIDth yy height#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) glScissor((GlintGLsizeixx-yy#elsesetScissorInPoints y xx yy#endif}else glEnableGL_SCISSOR_TEST)(),0)">));//gldisable(GL_SCISSOR_TEST); frame

实际使用我新建了名为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:Thenative API APImswincoredeBUGl1-11.dll:OutputDeBUGStringA isnt allowed in assembly libcocos2ddllUpdate it andthentry again synch20.dllCreateMutexExACreateEventExA assembly libGLESv2_phone.

记得提交到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)方法,注释掉内容。

Release版本无声音,在CocosDenshion/wp8/Audio.cpp中注释此行:

m_soundEffects[sound].m_soundEffectSourceVoice->SetVolumem_soundEffctVolume);

如图:

关于内购:

WP8完美支持C++,所以内购其实很简单。

对于Consumable产品,可以用IsConsumable来加以判断,当然你设置产品属性的时候可能已经知道类型,这里可以可以免于判断了。重要的是使用IsActive判断用户是否计费成功。记得给用户发放道具之后,要调用以下方法来向服务器汇报,否则你将无法继续下次计费。

CurrentApp::ReportProductFulfillmentproductID);

对于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项目移植到WP8小记所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1058897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)