利用Cocos Studio触发器创建项目

不知到多少用户已经开始用触发器了,经过两个版本的完善,触发器也越来越实用了,2014 CocoaChina 春季开发者大会上 视频展示了开水哥8分钟完成 一个Flappy Bird看了那个演示估计很多人心花怒放了,终于可以节省时间泡妹子去了
但是触发器目前还仅仅是模拟器,需要搭配Cocos Studio场景编辑器才能使用,我们如何利用触发器发布游戏包呢?今天小编将带大家一探究竟。
正文走起~~ 注意: 以下工作环境为Cocos2d-x 3.0RC0(2.x方法相同,唯独创建的项目结构不同,省去添加库部分内容)CocoStudio 1.3.0.0Visual Studio 2010Windows系统
一、创建一个游戏项目

既然要做一个使用触发器的Cocos2d-x 项目,那第一步就要先创建一个Cocos2d-x 项目。关于项目创建部分现在很多参考资料,这里不做赘述。下面是我自己使用的创建脚本


D:\cocos2d-x\cocos2d-x-3.0rc0\tools\cocos2d-console\bin>cocos.pynew -p org.cocostudio.triggertest -l cpp -d ../../../projectsTriggerTest

由于现在触发器目前是使用C++做的,所以我们这里选择的语言使用的是CPP(c++)。 创建完成后我们就有一个Cocos2d-x 项目了,由于Cocos2d-x3.0RC0 版本创建的版本不会包含libCocoStudio的解析库,我们还需要添加libCocoStudio解析库。 点击解决方案管理器,右键菜单选择“添加”-》“现有项目”,选择以下三个项目:


\cocos2d\cocos\editor-support\cocostudio\proj.win32\libCocosStudio.vcxproj  
\cocos2d\extensions\proj.win32\libExtensions.vcxproj  
\cocos2d\cocos\ui\proj.win32\libGUI.vcxproj  

以上三个项目的入口文件均在当前创建项目的文件夹下。

引入后还需要添加引用:

以及设置TriggerTest项目属性:然后, 我们TriggerTest项目属性(点击右键选择属性)中选择 “配置属性” => “C/C++” => “附加包含目录” 并编辑. 添加下面几行
(EngineRoot)cocos (EngineRoot)extensions
(EngineRoot)cocos\editor-support\ (EngineRoot)cocos\editor-support\cocostudio 如果需要详细了解引入库部分,欢迎参考:http://www.cocoachina.com/bbs/read.php?tid=194668
二、拷贝CocoStudio模拟器代码
使用触发器搭建项目其实并不用我们做过多的改动,因为我们想要的东西和Cocos Studio的模拟器是十分类似的东西,而Cocos Studio的模拟器已经开源的。所以我们可以直接取来改一改。
模拟器的源码托管在https://github.com/chukong/CocoStudioConnector
注意:(在完成该教程后将会提供cocos2d-x3.0版本的win32模拟器,暂时可以从点此下载3.0RC0版本class文件夹: CocoStudioTriggerClasses.zip (10 KB) )
下载完成后,我们可以在下面文件夹内找到win32的工程:
CocoStudioConnector-master\platform\win32
我们需要的仅仅是这一个,ios和安卓的仅仅在此基本功能上添加了二维码扫描功能和服务器连接功能,自建就不再需要了~ 将CocoStudioConnector工程下的class文件夹替换掉我们自己创建的游戏项目的Class文件夹。在class文件夹中tinyxml是xml解析第三方库,trigger文件夹存放生成后的解析文件(注意,每次生成可能需要替换该文件,这个取决于你是否修改了触发器内容)。另外还有绘制碰撞区的ColliderRectDrawer类和解析数据的ReadJSHelper类。其中tinyxml和ReadJSHelper负责解析由编辑器传来的一些命令行参数,自建项目没用到可以删除。

若引入ReadJSHelper可能会报“Error:无法打开源文件”tinyxmml.h””异常,这个是由于我们将tinyxml单独放到一个筛选器里(累死于文件夹),所以要加路径“tinyxml/tinyxml.h” 添加完资源后只需要改动一行:

CCNode *pNode =cocos2d::extension::SceneReader::sharedSceneReader()->createNodeWithSceneFile(ReadJSHelper::Instance()->GetJsonPath().c_str());

替换为

CCNode *pNode =cocos2d::extension::SceneReader::sharedSceneReader()->createNodeWithSceneFile($场景的文件);

三、添加场景 此时这个工程已经创建完毕,我们拿来一个资源,这里就选择cocostudio场景编辑器自带的FightingScene场景作为游戏。

我们copy这个示例,为了看到效果,我们随意添加两个触发器。

截图中的配置是将左侧的英雄在点击屏幕的时候旋转180度。
关于触发器使用可以参考:http://www.cocoachina.com/bbs/read.php?tid=179215 修改完成后点击“确定”即可。
现在这个场景已经算编辑完成,下面可以将这个项目导出。菜单栏-》文件-》导出项目-》导出资源。导出后将当前编辑器项目文件夹下的:Resources文件夹的资源添加进游戏项目的Resources文件夹下。 注意:如果触发器里的条件不符合自己的条件,需要扩展的话,请参考:http://www.cocoachina.com/bbs/read.php?tid=194739。修改完成后点击“生成”按钮生成代码(就是生产Trigger文件夹下的5个文件)。每一次对触发器配置的调整都需要将该场景目录下的code文件下的5个文件替换掉游戏项目的class/trigger目录下的5个文件。
四、运行程序
直接编译,并运行,然后就可以看到我们自己的项目窗口已经实现了和编辑器完全相同的效果,所有注册的触发器也均可以实现。

后记:写完教程发现转换到3.0版本还需要自己改动很多东西,所以就直接提供3.0版本的模拟器了~大家就不用弄那么麻烦的自己敲代码了,基本会创建项目就能搞定上面的内容,注意选择版本即可。

:3:强力!感谢分享!

哪里有3.0的模拟器。。。下载的class里面把代码拖进去编译出错。

你好,我文中提供的代码就是cocos2d-x3.0RC版本的

可是哪里有提供3.0的模拟器啊。。文中下载的模拟器在3.0下用要改很多地方才能用。。。

你是报错了还是?

艰难的弄了2小时 3.0版本
首先ReadJSHelper.cpp 的第三行和65行报错 64行我改为 ssize_t _size; 这样改可以么?

然后导入我的包含了NewAnimation.ExportJson NewAnimation0.plist NewScene.json的场景
运行后有精灵有音乐 没触发没碰撞检测 明天改改再测试…:10:

最后导入了我随便做的场景(有点击后移动事件) 只包含了NewScene.json 运行后正常与场景编辑器的一样 :7:

成功了! 好激动:874: :874: :874:

NewAnimation.ExportJson NewAnimation0.plist要放在publish文件夹下

可以给大家分享下经验呦~:14:

cocostudio可以支持用脚本条件出发的动作吗?目前就MoveBy,MoveTo那10几个,可以能不够,我想脚本中任意添加,然后cocostudio也能读取出来,行吗?

http://www.cocoachina.com/bbs/read.php?tid=194739

可以根据模拟器创建方式自己来扩展,后期我们会考虑lua为主,这样编辑会更方便

为什么打包成Android的时候就崩溃了呢

********** Crash dump: **********
Build fingerprint: ‘DOOV-user 4.0.3 IML74K T973_11_3.07_130731 test-keys’
pid: 10432, tid: 10461, name: Thread-1050 >>> com.snowTest <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
Stack frame I/DEBUG ( 78): #00 pc 0026565c /data/data/com.snowTest/lib
/libcocos2dcpp.so (cocostudio::TriggerObj::serialize(rapidjson::GenericValue<rap
idjson::UTF8, rapidjson::MemoryPoolAllocatorrapidjson::CrtAllocator > co
nst&)+427): Routine cocostudio::TriggerObj::serialize(rapidjson::GenericValue<ra
pidjson::UTF8, rapidjson::MemoryPoolAllocatorrapidjson::CrtAllocator > c
onst&) at E:\cocos_workspace\snowTest\proj.android/jni/…/…/cocos2d/cocos/edito
r-support/cocostudio/TriggerObj.cpp:212
Stack frame I/DEBUG ( 78): #01 pc 00039b27 /system/lib/libc.so (__aeab
i_memmove8+2)
Stack frame I/DEBUG ( 78): #02 pc 0000003c : Unable to open s
ymbol file E:\cocos_workspace\snowTest\proj.android\obj\local\armeabi/.
Error (22): Invalid argument