Cocos2dx+lua打包wp8教程

研究了2周,终于研究出来,绝对原创,请转载的说明出处,这个内容可能有点长,但是如果你按照教程走,则一定会成功的,下面来说步骤:

一:开发环境和SDK
Win8 操作系统:这里在官网上下载企业版或者专业版,因为这两个版本才支持Hyper-V 服务;
windowsphone SDK8.0
vs2012 或者vs2013 :如果你的真机用的操作系统是window phone 8.1,那么你的vs2012 要更新update ,但是我这里建议用vs2013 ,就懒得更新了;
Cocos2dx3.0 :官网下载;
quickv3 :地址为https://github.com/dualface/v3quick ,因为我是模仿quickv3 来打包的,所以你可以下载下来研究一下,后面会讲;
真机:这里我用的操作系统为8.1
二:真机测试
1. 调试前的准备:
首先你必须是微软开发者账号(现在是免费的),现在的微软的账号(就是你安装win8 操作系统的时候叫你输入的账号)和开发者账号需要绑定的;
主要是手机上要下载“用于开发人员的预览”这个软件,然后安装就行了,可以参考http://jingyan.baidu.com/article/ff42efa9193fb8c19e22020b.html
2. 模拟器调试:
我这里没用模拟器调试,因为我的机子不支持虚拟化支持,如果要开启的话,你只需要打开bios 设置就行了,所以就没用模拟器调试;
3. 真机调试:
下载好cocos2dx3.0 以后,打开build 文件下的cocos2d-wp8.vc2012.sln ,然后选择cpp-tests 文件夹,然后把项目cpp-tests 设置为启动项目。
这时也要把模拟器设置device,平台设置为arm

然后运行看是否成功,如果能在真机上跑的话,恭喜你测试成功;
当然这里有可能调试遇到一个问题,就是指定的通信端口已经由另外一个程序使用,原因是你的手机原来用过真机调试并且通过了的,在手机上面有测试的项目,那么你就把它删除就行了;
三:打包到wp8 方法尝试并最终成功:
这里我尝试了多种方法,但是最终那一种成功了。
1. 首先我先想的是到底打包成静态库还是动态库,当时就查了一下他们之间的区别,我这里先就我说看的总结一下:
创建静态库:建立win32 ,然后生成,参考http://www.cnblogs.com/skynet/p/3372855.html
使用静态库(也叫静态链接库): http://www.cnblogs.com/skynet/p/3372855.html上面有方法,或者使用#pragmacomment(lib,”xxx,lib”); 这时需要将静态库lib 拷贝到工程目录下”,静态链接库的特点是:拷贝,不能增量更新;
创建动态库:参考http://www.cnblogs.com/skynet/p/3372855.html
使用动态库(动态链接库):这里有2 种方法:这里有dll 库和lib ,这里的lib 和静态库的lib 不一样,等会发几个参考链接;
第一种方法:载入时动态链接(隐式调用,静态调用dll ):#pragmacomment(lib,lib”); 还有一个extern “C”
第二种方法:运行时动态链接(显示调用,动态调用dll : 某个函数加载dll,调用完后释放,主要用LoadLibrary.
这里给几个网站:
当然这里讲的是win32 上的;
2. 然后静态库和动态库的区别我搞清楚了,然后我想的是怎么来把cocos2dx 所以的库打包成wp8 的库参考文章:
总结了大致过程 大致的调用过程为:C# Phone Application=>windows phone 运行时组件=>windowsphone 空静态库或者空动态链接库;
这时我想到的第一种方法是先建立 windows phone 空静态库, 然后把cocos2dx 所以的源代码拷贝到里面去(后来发现quickv3 就是这样做的),但是太多了,就没做。
然后我这时把cocos2dx3.0 建立的c++ 项目打开发现有wp8 的分支,而且除了liblua 库其余所有的库都有wp8 的包,那么我就只打liblua 库成wp8 就行了。

所以我打开打开build 文件下的cocos2d-wp8.vc2012.sln ,然后选择cpp-empty-test 文件夹,然后在cocos2d-x-3.0\tests\cpp-empty-test\proj-wp8-xaml 文件下面添加了一个文件夹liblua 文件夹,然后右键点击cpp-empty-test 文件夹,添加项目,选择 空静态库,位置在刚刚建立的liblua文件夹下面:


但是这时编译运行遇到到很多问题,而且最大的问题是无法解析的外部符号(这个问题后面会解释的),这时我暂停了几天,又在网上问了一下,了解到quickv3 框架。
1. 这时我又尝试了另外一种方法:了解到quickv3 框架如果编码的话,主要是用lua 写的,而且http://cn.cocos2d-x.org/tutorial/show?id=1303 这个网址是说的怎么来建立quick 项目的。
然后项目建立成功后,生成的项目有wp8 的分支。但时这时quickv3 发现是用的cocos2dx3.2 来封装的,而我用的是cocos2dx3.0 ,由于我现在的lua 代码的框架都写好了,所以就懒得改,而且用cocos2dx3.2 可能还有风险,至少3.0 稳定一些。
所以我当时想的是把cocos2dx3.0 的库直接替换掉libquickx quickv3 里面的一个项目)里面的库(就是把库的源代码替换掉),但是出问题了,quickv3 自己又多了一些封装,而且事件处理自己又封装了一些,所以这时候没法弄,还是没成功。
3. 这是我想到了第三种方法:我直接模仿quickv3 libquickx 项目来做一个我自己的liblua 库,最终成功了,下面我来说一下过程和我遇到的问题:其实就是一些配置和路径的设置;
@1 :上面已经说了( 第三的第2 ) 先把liblua 项目建好,然后把liblua 项目设置成启动项目,
然在liblua 项目下面添加筛选器如下:

这是建立的项目:


然后在cocos2dx 项目把对应的文件夹找到源文件加入进来就行了;
auto 文件夹下的:cocos2d-x-3.0\cocos\scripting\lua-bindings\auto



lua 文件夹下的:cocos2d-x-3.0\external\lua\lua ( 这个很多,我只截取一部分)



Manual 文件夹下的:cocos2d-x-3.0\cocos\scripting\lua-bindings\manual



script 文件夹下的:cocos2d-x-3.0\cocos\scripting\lua-bindings\script



tolua 文件夹下的:cocos2d-x-3.0\external\lua\tolua


好,这里基本上添加完了,然后是配置

@2 :在liblua 这个项目中加入对cocos 其它库的依赖,右键点击liblua 项目,打开属性页,在通用属性下的框架和引用中


单击添加新引用:添加库的依赖,加了以后是这样的:

虽然库已经添加进来了,但是还应该有目录的,所以在“配置属性”下的“c/c++”目录下的“常规”选项中的“附加包含目录”添加:


这里我把目录列举出来,你们到时添加就行了:
$(EngineRoot)cocos\2d\platform\wp8

$(EngineRoot)cocos\2d\platform\winrt
$(EngineRoot)\external\winrt-specific\angle\include
$(EngineRoot)\external\winrt-specific
$(EngineRoot)cocos\2d
$(EngineRoot)cocos\math\kazmath
$(EngineRoot)cocos\audio\include
$(EngineRoot)cocos\2d\renderer
$(EngineRoot)cocos\ui
$(EngineRoot)cocos
$(EngineRoot)cocos\base
$(EngineRoot)cocos\physics
$(EngineRoot)external\chipmunk\include\chipmunk
$(EngineRoot)external
$(EngineRoot)cocos\editor-support
$(EngineRoot)
$(EngineRoot)cocos\math\kazmath\include
$(EngineRoot)cocos\deprecated
$(EngineRoot)external\win32-specific\gles\include\OGLES
$(EngineRoot)external\glfw3\include\win32
$(EngineRoot)cocos\scripting\lua-bindings\manual
$(EngineRoot)cocos\scripting\lua-bindings\auto
$(EngineRoot)cocos\scripting\lua-bindings\script
$(EngineRoot)external\lua
$(EngineRoot)external\lua\luajit\include
$(EngineRoot)external\lua\tolua
$(EngineRoot)external\libwebsockets\win32\include
$(EngineRoot)extensions\network
$(EngineRoot)extensions
$(EngineRoot)cocos\editor-support\spine
$(EngineRoot)cocos\editor-support\cocosbuilder
$(EngineRoot)cocos\editor-support\cocostudio

下面是配置完后的状态:
@3:然后是模仿quickv3中的libquickx来进行配置,我只上图,然后对应起来设置就行了
C/C++中的常规选择:
在C/C++中的预处理器这的预处理器定义中加入宏:
WP8
_LIB
_DEBUG
COCOS2D_DEBUG=1
CC_LUA_ENGINE_ENABLED=1
__STRICT_ANSI__
SQLITE_OS_WINRT
SQLITE_OMIT_WAL
CC_USE_JSON=1
CC_USE_CURL=1
CC_USE_CCS_ARMATURE=1
CC_USE_EXTRA_FILTERS=1
CC_USE_WEBSOCKET=1
CC_USE_TGA=1
CC_USE_SQLITE=1
如下:
然后在C/C++中的代码生成中设置:
然后在C/C++中的高级选择中设置:(强制包含文件手动输入pch.h)
@4:当然由于liblua项目中有c文件,我们必须把所以的c文件单独设置才行,否则就是无法解析的外部符号了。标记所以的c文件然后然后右击属性窗口来设置,如图:
.c文件在lua,Manual,tolua下面均有;
在c/c++中的常规中
在c/c++中的预编译头中设置:
然后在C/C++中的高级选择中设置:


@5:这时把平台设置为ARM,并且把liblua项目设置为启动项目,运行,等待。。。。。
现在主要是改cocos2dx3.0里的一些库:

Probelm1:..\..\..\..\..\cocos\scripting\lua-bindings\auto\lua_cocos2dx_auto.cpp(54393): error C2039: “createWithRect”: 不是“cocos2d::GLView”的成员:

在lua_cocos2dx_auto.cpp文件中
凡是遇到createWithRect调用的都注释掉;
如:
凡是遇到createWithFullScreen的都注释掉;
@6:运行项目(现在不管警告),如果有下面弹出窗口,恭喜你liblua库成功了,但是还会改库的(在后面):
@7:测试该项目:
在cpp-empty-testComponent项目中添加对liblua库的引用,一样右击cpp-empty-testComponent项目,在通用属性中添加新引用,把liblua库添加进来,而且
同样的要在C/C++常规中添加附加包含目录:
然后在AppDelegate.h中添加#include "CCLuaEngine.h"头文件,
在AppDelegate.cpp中的applicationDidFinishLaunching()函数中的代码全部注释,改成如下:
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
#else
glview = GLView::createWithRect("testLua",Rect(0,960,640));
director->setOpenGLView(glview);
#endif
}
auto engine = LuaEngine::getInstance();
ScriptEngineManager::getInstance()->setScriptEngine(engine);
engine->executeScriptFile("main.lua");
@8:上面完成后,把cpp-empty-testComponent项目设置为启动项目,运行,发现有问题:
Probelm1:error LNK2019: unresolved external symbol "public: void __cdecl cocos2d::Console::stop(void)" (?stop@Console@cocos2d@@QAAXXZ) 等类似的问题
解决办法:打开lua_cocos2dx_auto.cpp文件
把函数lua_cocos2dx_Console_stop(),lua_cocos2dx_Console_listenOnTCP(),
lua_cocos2dx_Console_listenOnFileDescriptor(),lua_cocos2dx_Console_log(),这四个函数注释掉,而且还有函数lua_register_cocos2dx_Console()中的 tolua_function(tolua_S,"stop",lua_cocos2dx_Console_stop);
tolua_function(tolua_S,"listenOnTCP",lua_cocos2dx_Console_listenOnTCP);tolua_function(tolua_S,"listenOnFileDescriptor",lua_cocos2dx_Console_listenOnFileDescriptor);

Probelm2:liblua.lib(lua_cocos2dx_extension_auto.obj) : error LNK2019: unresolved external symbol "public: void __cdecl cocos2d::extension::AssetsManager::setStoragePath(char const *)
解决办法:这是因为在wp8库libExtensions下面的AssetsManager文件里夹里没有加入AssetsManager类,但是lua绑定的时候却又绑定了,所以加入进来就行了,那个类在cocos2d-x-3.0\extensions\assets-manager这个文件夹下:
但是这时要在AssetsManager.cpp中注释一些代码:
并且同样的要在liblua项目下的“配置属性”下的“c/c++”目录下的“常规”选项中的“附加包含目录”添加:
$(EngineRoot)extensions\assets-manager

Probelm3:iblua.lib(lua_cocos2dx_manual.obj) : error LNK2019: unresolved external symbol "public: void __cdecl cocos2d::Console::addCommand()

解决办法:在lua_cocos2dx_manual.cpp文件中把lua_cocos2dx_Console_addCommand()和 lua_cocos2dx_Console_send()这2个函数注释掉,而且在extendConsole()这个函数中把


如果pp-empty-testComponent项目运行没错,则成功;
@9:
由于当执行代码auto engine = LuaEngine::getInstance();时lua引擎自己会加载lua文件,所以把cocos2d-x-3.0\cocos\scripting\lua-bindings\script下的所有lua文件全部拷贝到
cocos2d-x-3.0\tests\cpp-empty-test\Resources下面即可;
在@7中的main.lua文件也是放到cocos2d-x-3.0\tests\cpp-empty-test\Resources下面的(包括你以后的lua代码和资源都放在这里的);
main.lua文件代码如下:
cc.Director:getInstance():setDisplayStats(true)
cc.Director:getInstance():setAnimationInterval(0.01)
这里我只要让手机屏幕的左下角显示出GL Verts:和GL calls就表示可以访问lua文件了,恭喜成功了。(当然你也可以加载图片来测试)
四:虽然打包完成,可以调用lua,但是在wp8平台运行的游戏可能还有许多问题,需要慢慢来改,如果遇到了而且解决了我也会随时更新的。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...