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

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

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

前三期的总结:
第一期: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

CCArmatureDataManager::sharedArmatureDataManager()->purge(); 是不是清除不了内存?

用cocos2d-x 2.2.0 开发的一个游戏,每个关卡需要加载100张左右的图片。目前加载的图片内存释放有问题,请教。

加载图片是这么实现的。

cocos2d::CCSprite* ImgStage0;
cocos2d::CCSprite* ImgStage1;
cocos2d::CCSprite* ImgStage2;
cocos2d::CCSprite* ImgStage3;
…(省略剩余的)

cocos2d::CCTexture2D* ImgStage0T2D;
cocos2d::CCTexture2D* ImgStage1T2D;
cocos2d::CCTexture2D* ImgStage2T2D;
cocos2d::CCTexture2D* ImgStage3T2D;
…(省略剩余的)

ImgStage0T2D = loadImageTexture2D("a0@2x.png"); ImgStage0 = loadImageSprite(ImgStage0T2D); ImgStage0->retain();
ImgStage1T2D = loadImageTexture2D("a1@2x.png"); ImgStage1 = loadImageSprite(ImgStage1T2D); ImgStage1->retain();

ImgStage2T2D = loadImageTexture2D("a2@2x.png"); ImgStage2 = loadImageSprite(ImgStage2T2D); ImgStage2->retain();

ImgStage3T2D = loadImageTexture2D("a3@2x.jpg"); ImgStage3 = ImgStage3(ImgStage3T2D); ImgStage3->retain();

…(省略剩余的)

释放CCSprite部分

直接用的release函数
ImgStage0->release();
ImgStage1->release();
ImgStage2->release();
ImgStage3->release();
…(省略剩余的)

释放CCTexture2D方面
removeTexture2D(ImgStage0);
removeTexture2D(ImgStage1);
removeTexture2D(ImgStage2);
removeTexture2D(ImgStage3);

…(省略剩余的)

具体封装函数如下:
/-----------------------------------------------------------------------------
*
*
-----------------------------------------------------------------------------
/
cocos2d::CCTexture2D* TTBase::loadImageTexture2D(const char* imgString)
{
return CCTextureCache::sharedTextureCache()->addImage(imgString);
}

/-----------------------------------------------------------------------------
*
*
-----------------------------------------------------------------------------
/
cocos2d::CCSprite* TTBase::loadImageSprite(cocos2d::CCTexture2D* imgTexture2D)
{
return CCSprite::createWithTexture(imgTexture2D);

}

/-----------------------------------------------------------------------------
*
*
-----------------------------------------------------------------------------
/
void TTBase::removeTexture2D(cocos2d::CCTexture2D* imgTexture2D)
{
CCTextureCache::sharedTextureCache()->removeTexture(imgTexture2D);
imgTexture2D=NULL;

}

感觉用CCTextureCache::sharedTextureCache()->removeTexture(imgTexture2D);和ImgStage0->release(); 后释放不掉图片占用的内存。加载3关后,会内存溢出崩溃,我想问问哪里出了问题。

cocos2d-x 3.0 beta 版本什么时候发啊 ,是不是这几天等着开发新项目呢。。

版本 cocos2d-x-3.0alpha1 cocos2d-html5 2.2.1

①jsb当中,如何对音频文件进行预加载??

preloadMusic和preloadEffect似乎并不起作用

附件包含了一个简单的示例和编译后的apk,当播放音频的情况下,掉帧很厉害,此时做帧动画并移动,会发现明显的卡顿,停止音乐后也需要等待几秒帧数才会恢复正常;
是我实现帧动画的方式不对,还是其他因素

②jsb中,loading界面不再出来,是为什么,我应该如何做好资源预加载的工作?

问题比较初级,望指点

全部都手动加载,你这个使用的方法也太原始了点把。看看教程用TP打包资源。
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(“res.plist”)// 通过TP打包的生成的res.plist读取,res.png文件中的图片资源
CCSprite *sp = CCSprite::createWithSpriteFrameName(“back.png”);//使用res.png中名称为back.png的图片并初始化为精灵
精灵的计数管理交给它被添加的node,
当进行内存释放时,使用下面的方法智能释放,如果释放不成功,肯定是你的sp的计数出了问题,要么就是sp被手动retain了,破坏了autorelease,要么就是sp还存在于一个没有被release的node中
CCSpriteFrameCache::sharedSpriteFrameCache()->removeUnusedSpriteFrames();// 释放内存中已经没有被使用的精灵缓存
CCTextureCache::sharedTextureCache()->removeUnusedTextures();//释放内存中为使用的纹理图片集
当然res.plist这样的打包可能有多
PS:还有要注意的是res.png是个图片集,图片集中只要有一个被使用,res.png这个纹理图片集是不会释放掉的,
如果你不嫌麻烦,可以一张图片打包成一个图片集,

cocos2dx 像做这样的翻页效果在CCLayer上。有什么提示么。
样子如下
http://code4app.com/ios/中间翻页/5232ada86803face78000002

cocos2d像书一样翻页的效果,在一个屏幕里有俩页书

我像类似你的效果
也是俩页书

问题1:
只想在精灵添加了点击 EventDispatcher 事件,为什么点击精灵区域以外的地方, listener 事件也能接收到呢?
现在只想让精灵,接收点击 listener事件。
下面是处理代码:请大神帮忙看一下,是否代码使用上有问题,先谢啦!
环境: win8 vs2012 cocos2d-x 3.0 alpha1

在使用 回调方法] 方式 及 方式结果都是一样的, 在精灵区域外的地方,也能收到点击事件。

// add your codes below...
auto player = Sprite::create("Player.png", Rect(0, 0, 27, 40) );
player->setPosition(Point(origin.x + player->getContentSize().width/2,
    origin.y + visibleSize.height/2) );
this->addChild(player, 1, 10);

auto dispatcherPlay = Director::getInstance()->getEventDispatcher();
auto listenerPlay = EventListenerTouchAllAtOnce::create();

// 事件处理 回调方法] 方式
listenerPlay->onTouchesMoved = CC_CALLBACK_2(HelloWorld::onPlayerTouchesMoved, this);

// 事件处理 方式
// listenerPlay->onTouchesMoved = ](const std::vector<Touch*>& touches, Event unused_event){
// log(“Player to move”);
// Touch
touch = touches;
// auto player = static_cast<Sprite*>(unused_event->getCurrentTarget());
// player->setPosition(player->getPosition()+touch->getDelta());
// };

dispatcherPlay->addEventListenerWithSceneGraphPriority(listenerPlay, player);

问题2:
在上一版本 cocos2d-x 3.0 alpha0 中设置 EventDispatcher 事件
在设置【EventListenerTouch::create(Touch::DispatchMode::ONE_BY_ONE)】
alpha1中已经修改为【EventListenerTouchOneByOne::create()】
点击时可以通过 myListener->setSwallowTouches(true) 此句消息就不会向下传递。
在 alpha1 此方法已经不在使用, 那在 alpha1 中是如何处理的。
以后在 beta 或是 release 正式版本中还会有所改动吗?

如果你有例子先告诉我吧

请教一个基本概念:Sprite和SpriteBatchNode的区别在哪里?什么时候应该用SpriteBatchNode?

一些关于CocoStudio的问题:
1)Animation/UI/Scene编辑器中的路径设置太不够灵活,为什么资源一定要限制在Resource目录中,希望能在项目的路径配置上做到灵活。
2)编辑器之间的文件共享太不方便,我在UI中更改了布局,需要先导出项目再从Scene中再进行导入才能使用,太耽误事。而且导入后需要重新打开Scene编辑器才能起作用。
3)CocosBuilder的作者去做SpriteHelper项目了,对于这个新的编辑器,Cocos2D-X是否有计划为其编写解析代码和进行JSBinding。毕竟CocoStudio目前没有Mac版实在降低工作效率。
4)目前CocosBuilder相对CocoStudio有更大的灵活性,而且开源可扩展,不知CocoStudio什么时候可以开源。

编辑器很关键,只是希望CocoStudio能尽快完善,让开发者用起来爽!

您好,这是一个问题:

cocos2d-x 2.2.1版本
UIScrollView无法自动裁剪滑动出视口范围的元素,导致不该显示的东西也显示出来了
在WIN32和安卓上没有问题
在IPHONE和IPAD都发现有问题

UIPageView同样有这个问题

问题:
请问开发组有没有计划提供 能支持HTML解析和超链接点击的富文本编辑框

cc.CallFunc.create(this.onRemoveSprite);
在执行this.onRemoveSprite函数时报错:
Assertion failure: !cx->isExceptionPending(), at …/jscntxtinlines.h:330
@王哲 这是什么原因呢?是调用参数不正确吗?

onRemoveSprite:function (sender) {
var p = sender.getParent();
if § {
p.removeChild(sender, true);
}

    },

vs2012 WP8 中文显示问题,我已经将编码格式转化成UTF8了,可是还是显示的是乱码,VS自带的转化编码也用了,全部都是乱码,代码我是这样转化的,可是在wp8模拟器上显示的还是乱码,请问该如何解决
char * G2U(const char* gb2312)
{

int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t;
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char;
memset(str, 0, len+1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete] wstr;
return str;
}

请问,背景音乐和音效 播放一段时间后, 有时会出现异样,杂音,变调。请问问题出在哪里呢。

使用的是js绑定
cc.AudioEngine.getInstance().playMusic(“bg.mp3”,true);
cc.AudioEngine.getInstance().playEffect(“res/aa.mp3”);

http://www.cocoachina.com/bbs/read.php?tid=175038
请问我的工程里少写了什么,外部调用 怎么找不到输出函数呢?

暂定是这个月底发布beta版