11月29日下午3点至5点,Cocos2d-x作者王哲在论坛中回答了大家关于
Cocos2d-x开发的相关问题,以下汇总了开发者重点关注的问题。因为距离问题无法到厦门和成都获得活动现场技术支持的朋友,可以在每周五下午
3点至5点到论坛提出自己的疑问。
问题:3.0UI部分有哪些改变?
答:extensions/CCControl系列不再维护了。而是重新设计了新的GUI框架,在cocos/gui下面。我认为GUI系统的发展可以分四个阶段
1. fixed position。也就是cocos2d-x 1.x版本,cocos2d-iphone目前版本的水平
2. relative position。也就是cocos2d-x 2.x的水平
3. layout, v-box, h-box,也就是Android GUI系统,cocos2d-x 3.0 GUI的水平
4. web那种css, html图文混排的水平。目前我们还没做到。
目前3.0 GUI就在上述level-3的水平上。当然layout这种东西用手写就很麻烦了,3.0 GUI的另外一个好处是可以直接在CocoStudio里面让美工做布局了。
问题:
最新版本3.0的进展情况。以及正式版何时发布。
答:3.0虽然现在只是alpha1版,但实际上除了new renderer 之外,其他功能都已经基本OK了,接口和目录结构也已经稳定了。Ricardo很想叫beta版,我觉得既然还没把所有计划中的功能全部做完开始“仅修bug”,就只能继续叫alpha。
后续的计划是,大概12月底或1月初发beta版,带 new renderer, 完善目前 new label,以及BUG修复,增加好用的工具链,增加文档,CocoStudio同步。然后在2月份发3.0 final 版,可商用的2.5D功能计划在3.1版里面出来。
问题:
现在是否推荐使用cocos2dx 3.0做项目,还是至少等beta 版
答:目前有不少公司在用3.0做项目了。推荐直接从3.0-alpha1开始。下个版本是beta版,不再修改API和目录结构了。
问题:
我想问一下在cocos2d-x中用什么实现线程间的通信比较好呢?就拿主线程和负责socket的子线程来说吧,socket拿到数据后要交给主线程更新UI,主线程的某些操作产生的数据交给子线程让socket去发送。刚开始我用的《捕鱼达人》这本书中扩展的那个线程安全的MTNotificationCenter,子线程给主线程发消息ok,但是貌似主线程不能给子线程发消息,因为addObserver的时候要传递一个this指针,但是在static方法中没用this指针(多线程使用pthread实现的)...后来改用msg,不过这个跨平台就不方便了,好像安卓上禁用了这个方法。。最后改用STL存储数据,然后给他加锁,用一个while循环来读数据,有就读出来。不知道有没有更好的方法来实现线程间的消息传递?
还有一个是editBox的显示问题,在scrollView中加入editBox,滑动scrollview后,再触摸editBox打开键盘,文本输入的位置不在editBox当前的位置,而是在editBox初始化时的位置,键盘关闭后才显示到editBox的当前位置上去。
答:多线程方面的消息传递方面,目前cocos没有封装这块。你可以参考标准的“生产者-消费者模型”来实现。网上可以搜到很多实现。另外,我在2.x版本里面的写的 https://github.com/cocos2d/cocos2d-x/blob/master/extensions/network/HttpClient.cpp 这个也可以参考一下,没有做很纯粹的封装,不过用 CCArray 做了两个队列,在网络和UI线程里面分别用 pthread_mutex_lock/unlock 加锁解锁。
EditBox是分平台实现的,你需要说描述一下平台、平台版本、机型、出问题的输入法(比如三星S4,安卓4.0,百度输入法这样)。
问题:
以前是用动作回调的方法实现的,3.0会有一个较好的方法。
答:2.2的extension里面也有一个NotificationCenter。不过和3.0的EventDispatcher比起来就小巫见大巫了。比较抱歉EventDispatcher的文档还没写出来,只能先看看sample code了
https://github.com/cocos2d/cocos2d-x/tree/develop/samples/Cpp/TestCpp/Classes/NewEventDispatcherTest
注意里面custom event的派发和接收方法。但EventDispatcher和NotificationCenter都不是线程安全的,比较完善的还是用我前面帖子里提到的生产者-消费者模型。
问题:
我用cocos2dx2.2.0 + cocostudio1.0.2.0,进行CCArmature:setScale(0.5)进行缩放之后,一播动作就出现变形,只有Y轴缩小,X轴没有缩,这是bug吗?
答:我刚刚又测试了一遍Armature的代码,发现没有这个问题。setScale(0.5)只缩Y,不缩X。请先确认有没有在别的地方也设置过,或者函数调用错误。最好把代码贴出来看看。
问题:
我想问一下关于开发语言的选择问题。我使用cocos2dx不久,从html5入手的。cocos2dx jsb是一个很吸引我的特性,它使得在开发者在前期可以利用浏览器进行便捷的开发/调试,并在后期方便的移植到android/ios平台。但是经过一段时间的使用,我发现html5和jsb或多或少有些不一致的地方,比如API的细微差别,有些功能没有binding到javascript等。
我想问一下,抛开对语言本身熟悉程度的差别,cocos2dx C++/Lua/Javascript哪一个是更好的选择呢?
答:看团队和项目的规模。越小型的项目,用C++/Lua就越快;越大型的项目,用js收益就越大。有些性能critical的游戏,比如coc-like游戏,就必须用c++用尽所有性能了。就流行程度而言,lua是最流行,也是最容易找到工作的。js基本都是一些大公司在用。
问题:
为什么不把CCNode的setUserObject设计成(id, value)的形式?现在这样,看上去很有弹性可以设置任何类型,可某个库在底层占用后(比如cc3.0的jsb),其它程序则没法使用。这个api就感觉不敢用,怕被坑或者坑人。弹性变成了束缚,不如用id。这样只要保证id不重复就可以放心使用了。即使id冲突了,只需简单换个id就可以了,不用担心既有程序的实现。
答:不错的建议。我建了一个issue来跟踪 http://www.cocos2d-x.org/issues/3322
问题:
是否可以使用assetsmanager来在线更新/添加jsc文件?如果可以的话,用这种方式来做更新岂不是很方便?
答:是的可以。不论用LUA或JS,在线更新逻辑脚本都很方便。
问题:
cocos2dx很多回调参数都是Obj类型,虽然看似这个类型很有用,但实际上用处非常之小,几乎无用,还有一个参数是触控的event*参数,不知道3.0版本以后会不会有所改变。
答:2.x版本因为需要和cocos2d-iphone保持同步,方便cocos2d-iphone游戏移植到android上,因此增加了如CCEvent这样冗余的占坑变量。3.0版本已经基本C++ pattern了,除了autorelease pool仍然无法移除掉。
问题:
目前3.0版本event*和大部分obj*参数都还没有移除,触控事件重构了以后event*还是没有删除?还是说暂时为了从2.0移植到3.0方便一些?
答:旧的TouchDispatcher没有删除,只是编译的时候会报warning告诉你deprecated了。因为需要兼容旧的代码。可能在未来若干个版本之后删除掉。2.2过来的将废弃函数基本都是这种做法。新的EventDispatcher是自己一套体系,和TouchDispatcher并行的。
问题:
我们现在在使用coco2dx-wp8, 多谢cocos2dx现在demo已经正常了, 但是现在卡住了, 由于我们是用c++ 和 D3D写的, 现在没有办法调用c#的代码, 也就无法使用push notification, 集成第三方sdk(比如facebook). coco2dx-wp8是打算支持c++调c#的对吗? 这个功能大概什么时候可以放出呢?
答:说实话,cocos2d-x for wp8版本主要是微软Open Tech那帮人写的,我自己不懂wp8的机制,抱歉没能回答你的问题。我刚问了下同事,他之前集成过WP8上的c#版支付宝,但里面机制是调用起来支付宝客户端,结果我同时把做进程间通信的C#代码全部用C++翻译了一遍。但这个显然不是正确的解决办法。《我叫MT》的wp8版上线了,他们应该是已经解决了这个问题。
问题:
我想在cocos2d-jsb里使用pomelo,但pomelo官方的js库无法在cocos2d-jsb里使用。pomelo的论坛上有个兄弟用libpomelo封装了个cocos2d-x的类:http://nodejs.netease.com/topic/516e3106b5a2705b5a0bae84,我打算把这个CCPomelo绑定到js里来调用,想请教下这个方法可行吗?
答:我看了下 https://github.com/xdxttt/CCPomelo/ 这个仓库的readme,按照他这个思路来搞,是可行的。
问题:
cocos2d-x问什么不集成播放的功能啊...现在写播放必须一个平台写一套很麻烦。
答:英文论坛上这里有人贴代码 http://www.cocos2d-x.org/forums/6/topics/37176。这不是非常通用的需求。今年包括您在内只有2个开发者问这个功能。如果想要的人更多一些,那么我们就可以考虑做这个封装。
问题:
考虑在3.0集成这个ui库及场景管理吧,放弃渣渣一样的studioui。比较头疼的是2dx里面的控件类名,搞的我必须在前面加个C来区分,是不是有点恶心呢,嘿嘿。
答:我让负责GUI的同事去学习参考一下。控件类名的话,建议用namespace来区分,这也是3.0里面的做法。
问题:
近期内还会提供5-10个基础控件,估计控件总量会达到25个左右,我是觉得光开源太没意思了,直接加进去这样多好玩的。重名那个问题,我是用的namespace ,不过为了不跟扩展库里的东西冲突,每次都是cocoswidget::CCScrollView,这样来构造对象不是很麻烦么。
答:负责GUI的哥们这下压力大了。namespace你可以用两个,加个alias比如ccw:: ,这样代码写起来就比较省事。
问题:
我用cocos2dx2.2.0 + cocostudio1.0.2.0,进行CCArmature:setScale(0.5)进行缩放之后,一播动作就出现变形,只有Y轴缩小,X轴没有缩,这是bug吗?
答:我刚刚又测试了一遍Armature的代码,发现没有这个问题。setScale(0.5)只缩Y,不缩X。请先确认有没有在别的地方也设置过,或者函数调用错误。最好把代码贴出来看看。
问题:
请问localStorage在android和ios上是用什么实现的?其安全性是否有保障(是否易被篡改),还是说开发者需要在自己加入加密/解密逻辑?
答:LocalStorage在android上调用的是android sdk上的SQLite, 其他平台调用的是我们自己编译出来的SQLite。安全性没有保障,越狱机器就可以访问到那个文件,你需要自己加入加密/解密逻辑。
请问,是否可以使用assetsmanager来在线更新/添加jsc文件?如果可以的话,用这种方式来做更新岂不是很方便?
答:是的可以。不论用LUA或JS,在线更新逻辑脚本都很方便。
问题:
现在是否推荐使用cocos2dx 3.0做项目,还是至少等beta 版。
答:目前有不少公司在用3.0做项目了。推荐直接从3.0-alpha1开始。下个版本是beta版,不再修改API和目录结构了。
问题:
cocos2d-x很多回调参数都是Obj类型,虽然看似这个类型很有用,但实际上用处非常之小,几乎无用,还有一个参数是触控的event*参数,不知道3.0版本以后会不会有所改变。
答:2.x版本因为需要和cocos2d-iphone保持同步,方便cocos2d-iphone游戏移植到android上,因此增加了如CCEvent这样冗余的占坑变量。3.0版本已经基本C++ pattern了,除了autorelease pool仍然无法移除掉。
问题:
目前3.0版本event*和大部分obj*参数都还没有移除,触控事件重构了以后event*还是没有删除?还是说暂时为了从2.0移植到3.0方便一些?
答:旧的TouchDispatcher没有删除,只是编译的时候会报warning告诉你deprecated了。因为需要兼容旧的代码。可能在未来若干个版本之后删除掉。2.2过来的将废弃函数基本都是这种做法。新的EventDispatcher是自己一套体系,和TouchDispatcher并行的。
问题:
我们现在在使用coco2dx-wp8, 多谢cocos2dx现在demo已经正常了, 但是现在卡住了, 由于我们是用c++ 和 D3D写的, 现在没有办法调用c#的代码, 也就无法使用push notification, 集成第三方sdk(比如facebook). coco2dx-wp8是打算支持c++调c#的对吗? 这个功能大概什么时候可以放出呢?
答:说实话,cocos2d-x for wp8版本主要是微软Open Tech那帮人写的,我自己不懂wp8的机制,抱歉没能回答你的问题。我刚问了下同事,他之前集成过WP8上的c#版支付宝,但里面机制是调用起来支付宝客户端,结果我同时把做进程间通信的C#代码全部用C++翻译了一遍。但这个显然不是正确的解决办法。《我叫MT》的wp8版上线了,他们应该是已经解决了这个问题。