Cocos2d-x作者王哲在_2013_11_29_ 线问题答疑汇总

问题:
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和目录结构了。

问题:
我想问一下在cocos2dx中用什么实现线程间的通信比较好呢?
就拿主线程和负责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里面的做法。

问题:请问你如何看待unity 2d。

答:
Unity2d的编辑工具非常强,这点必须承认。
另一方面,我们自己测试下来做同样一个2D的性能测试例,cocos包体积3M,unity 7M,2000个sprite同时运动的时候,
即使unity pro开了alpha cutout,帧率也只有cocos的50%. 这还是没有上3.0 new renderer的情况。renderer重构完成后,加上自动剔除功能,性能会比当前更上一次层楼。
但是他们固有的一些问题并没有解决,比如开发后期编译到ios/android上调试很困难,资源大了导出一次需要十几分钟,做性能和包体积优化很困难,游戏无法在线更新等。

问题:
近期内还会提供5-10个基础控件,估计控件总量会达到25个左右,我是觉得光开源太没意思了,直接加进去这样多好玩的。
重名那个问题,我是用的namespace ,不过为了不跟扩展库里的东西冲突,每次都是cocoswidget::CCScrollView,这样来构造对象不是很麻烦么。

答:
负责GUI的哥们这下压力大了。namespace你可以用两个,加个alias比如ccw:: ,这样代码写起来就比较省事。

:867: :867: :867:

么么哒:867::867: