1月17日下午3点至5点Cocos2d-x作者王哲在线问答交流第八期~

虽然我叫MT、大掌门、神仙道、捕鱼达人等多款明星游戏均使用Cocos2d-x进行开发,但引擎团队深知还有许多不足之处。为更好地服务全国各地的开发者朋友,Cocos团队特别开设定期线上技术支持!

每周五下午3点至5点Cocos2d-x作者王哲将在CocoaChina上和大家做线上交流。

1月17日明天活动仍然按时举行,有问题的童鞋可以在本贴中留言。

前七期的总结:
第一期:http://www.cocoachina.com/gamedev/gameengine/2013/1202/7455.html

第二期:http://www.cocoachina.com/gamedev/gameengine/2013/1210/7509.html

第三期:http://www.cocoachina.com/gamedev/gameengine/2013/1217/7555.html

第四期:http://www.cocoachina.com/bbs/read.php?tid=174668

第五期:http://www.cocoachina.com/bbs/read.php?tid=175781

第六期:http://www.cocoachina.com/bbs/read.php?tid=177813

第七期:http://www.cocoachina.com/bbs/read.php?tid=179599

王大大:
cocos2dx-2.x用了一年多,用的很熟练了,突然拿到3.0beta以后突然不知道该怎么下手了,问几个很多人关心的问题:

  1. 如何编译安卓apk啊?build_native.sh找不到啊?莫非只能用mac了?或者是不装cygwin就不能编译?
    2.能把cocoStudio的使用流程简介一下吗?UIEditor生成的ExportJson文件不能用是啊?Export.json是中间格式的文件吗?要给代码用,是不是必须经过SceneEditor导出json才能用?工具链之间的文件输入输出关系都是自己琢磨的,想请教一下官方的说法?

猜出来了一些,不知道对不对,请指点?
1.动画编辑器和UI编辑器编辑完毕以后导出,会生成Export文件夹,里面是生成好的资源以及ExportJson文件,可以把这些文件复制到游戏中当做资源直接调相关函数载ExportJson文件就可使用,比如:代码通过载入ExportJson生成Widget,骨骼动画对象,…
2.如果上述生成的资源文件是用来给场景编辑器做素材的,则不必手动复制到游戏资源里面,而是把步骤一生成的Exports复制到步骤二的Resource里面使用,等场景都编辑完成了再导出,场景编辑器会把自己的Resource文件夹里面的全部内容一起导出(里面已经包含了第一步生成的Exports),拷贝到游戏中做资源就行(生成的场景文件后缀是json,而其他资源仍是ExportJson后缀)
3.如果步骤一修改了,则必须手动把第一步的Exports重新拷贝到步骤二的Resouce里面.

王大,我猜的对不?

王大,关于cocostudio工具集,最近遇到一些麻烦
1,目前cocostudio中支持帧事件触发,但只能在编辑器中添加(好像只能在关键帧触发),对于动态第几帧触发并没有很好的支持,目前我们是通过schedule定时器计算帧间隔来模拟同步,但理论上不是很精确,有更好的实现方法吗?
2,目前cocostudio中,两个关键帧的图片位置如果不一致,会自动添加一个tween缓动,还不能去掉(必须得选择一个缓动函数),如果本身两张图片就需要这样摆放,就有些蛋疼了,能不能默认不缓动?
3,最重要的问题:目前cocostudio类库解析.ExportJson时,会默认在同目录下有个.png和.plist,假如现在觉得png资源有点大,想通过改图片格式的方式再次压缩,比如转换成“jpg+掩码”,这样类库就不支持了。而在我们游戏里,资源的压缩目前是个比较大的问题。我有个建议,能否把资源解析接口开放出来,支持扩展,比如像这样:
class IDecoder
{
public:
Texture2D decodeByFileName(fname)=0;
Texture2D decodeFromBuffer(buf)=0;
}

//自定义的XXX格式解析器
class XXXFormatDecoder:public IDecoder{…}

//可替换的工厂类实例
DecoderFactory.getInstance()->getByExt(".xxx");

类似这样的话,开发者对资源的控制可能会更方便一些。

3.0beta
Sprite 去掉了原来的virtual bool initWithTexture(Texture2D *texture);

现在是用 virtual void setTexture(Texture2D *texture) override;

但为什么。setTexture这个接口里不自动设置纹理的大小。
然而这个接口里 virtual void setTexture(const std::string &filename );又加了
Rect rect = Rect::ZERO;
rect.size = texture->getContentSize();
setTextureRect(rect);

我觉的这三行代码因该放到virtual void setTexture(Texture2D *texture) override;这个接口里最适合
省去了每次添加纹理的时候。还要再手动在外面再一次设置大小。

我又来顶贴啦!!!

求wp8 可用的libcurl库,我在移植2.2.0的现有项目到wp8,就差libcurl编不过了,http://www.cocos2d-x.org/forums/6/topics/43018?r=43022#message-43022 论坛Jingchen chen的curl分支不知道是不是有些平台宏的设置问题,我直接用他的libcurl库还是报错

之前用CocoStudio的时候出现过一个问题,我把Button设置成“setEnabled(false)”后Button就变成inVisible了而不是显示禁用图片,这个是Bug吗?

  • 如果用sh脚本,那就得安装mac和cygwin了
  • 但3.0里面改用tools/android-build.py,用python脚本省得维护sh和bat两份

这两期问题好少啊。。

·显示 禁用图片的方法是
:button->setBright(false);
button->setTouchEnabled(false);
两个一起用才可以··
应该在后面的版本有改进。

— Begin quote from ____

引用第7楼gigasong于2014-01-17 15:15发表的 :
之前用CocoStudio的时候出现过一个问题,我把Button设置成“setEnabled(false)”后Button就变成inVisible了而不是显示禁用图片,这个是Bug吗? http://www.cocoachina.com/bbs/job.php?action=topost&tid=181270&pid=876473

— End quote

是这样的,使用场景编辑器就是为了辅助我们管理资源。场景编辑可以用了管理UI和动画导出后的资源以及其他编辑器导出的资源(如地图文件tmx)。UI和动画的导出文件是可以单独使用的,如果您的场景较为简单或者同一个场景内的内容过多,您可以单独使用这部分类容。

哦,原来这样的,确实要改进下,这样写很奇怪。

— Begin quote from ____

引用第4楼zwpmain于2014-01-17 14:03发表的 :
3.0beta
Sprite 去掉了原来的virtual bool initWithTexture(Texture2D *texture);

现在是用 virtual void setTexture(Texture2D *texture) override;

http://www.cocoachina.com/bbs/job.php?action=topost&tid=181270&pid=876359

— End quote

有道理,我已经建立issue了%url%.

http://www.cocos2d-x.org/forums/6/topics/43018 这边回复你了哈,还 有问题欢迎在cocos2d-x.org/forums继续反馈哈, 谢谢

非常感谢,我试试先,有问题继续论坛,不要嫌麻烦啊,:5:

mac下,3.0 beta jsb 新建的工程无法用firefox调试啊。我在这里发过一个帖子了,没人理我。
帖子里有图有真相!

http://www.cocos2d-x.org/forums/20/topics/43017

在这诚恳地请教一个问题:3.0beta版本中TextureAtlas类有个函数void TextureAtlas::moveQuadsFromIndex(ssize_t oldIndex, ssize_t amount, ssize_t newIndex),定义如下所示
void TextureAtlas::moveQuadsFromIndex(ssize_t oldIndex, ssize_t amount, ssize_t newIndex)
{
CCASSERT(oldIndex>=0 && amount>=0 && newIndex>=0, “values must be >= 0”);
CCASSERT(newIndex + amount <= _totalQuads, “insertQuadFromIndex:atIndex: Invalid index”);
CCASSERT(oldIndex < _totalQuads, “insertQuadFromIndex:atIndex: Invalid index”);

if( oldIndex == newIndex )
{
    return;
}
//create buffer
size_t quadSize = sizeof(V3F_C4B_T2F_Quad);
V3F_C4B_T2F_Quad* tempQuads = (V3F_C4B_T2F_Quad*)malloc( quadSize * amount);
memcpy( tempQuads, &_quads, quadSize * amount );

if (newIndex < oldIndex)
{
    // move quads from newIndex to newIndex + amount to make room for buffer
    memmove( &_quads, &_quads, (oldIndex-newIndex)*quadSize);
}
else
{
    // move quads above back
    memmove( &_quads, &_quads, (newIndex-oldIndex)*quadSize);
}
memcpy( &_quads, tempQuads, amount*quadSize);

free(tempQuads);

_dirty = true;

}
当中的这一段
if (newIndex < oldIndex)
{
// move quads from newIndex to newIndex + amount to make room for buffer
memmove( &_quads, &_quads, (oldIndex-newIndex)*quadSize);
}
这个作者原意是不是要移动newIndex位置(开始算)起的(oldIndex-newIndex)*quadSize个字节到newIndex+amount位置?是的话这句是不是要这样写:
memmove( &_quads, &_quads, (oldIndex-newIndex)*quadSize);
或者是我理解错了!本人没有其它意思,单纯地看不懂这一点,特地请教!!如有冒犯,请见谅!!

还有这里有个BUG

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

— Begin quote from ____

引用第16楼icepower于2014-01-17 15:47发表的 :
mac下,3.0 beta jsb 新建的工程无法用firefox调试啊。我在这里发过一个帖子了,没人理我。
帖子里有图有真相!

http://www.cocos2d-x.org/forums/20/topics/43017 http://www.cocoachina.com/bbs/job.php?action=topost&tid=181270&pid=876503

— End quote

已经修复了,你可以参考https://github.com/cocos2d/cocos2d-x/pull/5070