在加载粒子效果Comet.plist内置的图片时失败,跟了一下发现好像是异步加载的问题,代码如下:
js侧
c++侧
求解,谢谢
你还,该问题已提交Html5团结,待解决后我们会及时给您回复。
你好,
没发现逻辑的问题呀。
var fileUtils = cc.FileUtils.getInstance();
var imgPath = fileUtils.fullPathFromRelativeFile(textureName, this._plistFile);
var tex = cc.TextureCache.getInstance().textureForKey(imgPath);
这里只是获取,并没有用addImage向texture里加imgPath,所以不会调用到textureCache里的代码。只是查找而已。
如果这时TextureCache里的texture里没有图片,就直接进入到下面的代码:
var textureData = locValueForKey(“textureImageData”, dictionary);
if (textureData && textureData.length == 0) {
tex = cc.TextureCache.getInstance().addImage(imgPath);
if (!tex)
return false;
this.setTexture(tex);
} else {
buffer = cc.unzipBase64AsArray(textureData, 1);
if (!buffer) {
cc.log("cc.ParticleSystem: error decoding or ungzipping textureImageData");
return false;
}
...
我们会先检测textureImageData的数据是否存在,如果没有,才使用addImage向texture加载图片。
Thanks for your feedback
David
在html5的版本里面
var fileUtils = cc.FileUtils.getInstance();
var imgPath = fileUtils.fullPathFromRelativeFile(textureName, this._plistFile);
var tex = cc.TextureCache.getInstance().textureForKey(imgPath);
得到的tex是有值的,虽然并没有加载图片,tex有值这个结果会导致下面的分支走this.setTexture(tex),c++在这里tex为null,是走的下面的分支
if (tex) {
this.setTexture(tex);
} else {
var textureData = locValueForKey(“textureImageData”, dictionary);
if (textureData && textureData.length == 0) {
tex = cc.TextureCache.getInstance().addImage(imgPath);
if (!tex)
return false;
this.setTexture(tex);
} else {
buffer = cc.unzipBase64AsArray(textureData, 1);
if (!buffer) {
cc.log("cc.ParticleSystem: error decoding or ungzipping textureImageData");
return false;
}
也就是if (tex)在html5和c++版本的判断结果不一样,走的分支不一样, 这个不是一个bug吗,html5版本压根就不会加载plist中内置的png,你打个断点就知道了,流程根本不会跑到那里去
问题是:如果你没有加载过这张同名图片,cc.TextureCache.getInstance().textureForKey(imgPath); 怎么会取得到值? 这个函数没有向服务器请求图片呀?
如果textureCache中已经加载这张图片,就没有必要再重新加载了,你说是吗?
下面是我在Particle Test 的BoilingFoam下的断点结果:




麻烦看清楚标题,是加载cocostudio自带的demoplayer导出的骨骼动画加载的时候出现的问题,这个骨骼动画里面带有粒子,不是单纯的加载粒子效果出现的问题
下面是我在原版的cocos2d-html5v2.2.2helloHTML5例子上修改的加载代码,看看有没有哪里写得不对,没有的话你们自己试试问题出在哪里,给你们提个bug真是费时间啊
resource.js
//beg
var s_HelloWorld = “res/HelloWorld.png”;
var s_CloseNormal = “res/CloseNormal.png”;
var s_CloseSelected = “res/CloseSelected.png”;
var s_Cowboy_json = “res/DemoPlayer/DemoPlayer.ExportJson”;
var s_Cowboy0_plist = “res/DemoPlayer/DemoPlayer0.plist”;
var s_Cowboy0_png = “res/DemoPlayer/DemoPlayer0.png”;
var s_Cowboy1_plist = “res/DemoPlayer/DemoPlayer1.plist”;
var s_Cowboy1_png = “res/DemoPlayer/DemoPlayer1.png”;
var s_Comet_plist = “res/DemoPlayer/Comet.plist”;
//end
var g_resources =
//image
{src:s_HelloWorld},
{src:s_CloseNormal},
{src:s_CloseSelected},
//beg
{src:s_Cowboy_json },
{src:s_Cowboy0_plist},
{src:s_Cowboy0_png},
{src:s_Cowboy1_plist},
{src:s_Cowboy1_png},
{src:s_Comet_plist},
//end
//plist
//fnt
//tmx
//bgm
//effect
];
myApp.js:
// add "HelloWorld" splash screen"
this.sprite = cc.Sprite.create("res/HelloWorld.png");
this.sprite.setPosition(size.width / 2, size.height / 2);
this.sprite.setScale(0.5);
this.sprite.setRotation(180);
lazyLayer.addChild(this.sprite, 0);
//beg
ccs.ArmatureDataManager.getInstance().addArmatureFileInfo(s_Cowboy_json);
var armature = ccs.Armature.create("DemoPlayer");
lazyLayer.addChild(armature);
//end
蓝色代表流程分支,debug变量里面也能看见tex是有值的,没有走下面加载内嵌png的流程
程序运行结果,如果播放带粒子的动画,会有errlog输出
不好意思,我以为是你提的是ParticleSystem的bug.

谢谢您的反馈。
hello, emutime@qq.com
我非常抱歉的对你说,我在v2.2.2中测试,还是未发现问题。下面是我的代码,以及运行截图:
Resource.js:
var g_resources =
//image
s_HelloWorld,
s_CloseNormal,
“res/Comet.plist”,
“res/DemoPlayer.ExportJson”,
“res/DemoPlayer0.plist”,
“res/DemoPlayer0.png”,
“res/DemoPlayer1.plist”,
“res/DemoPlayer1.png”,
s_CloseSelected
}
myApp.js:
lazyLayer.addChild(this.sprite, 0);
ccs.ArmatureDataManager.getInstance().addArmatureFileInfo("res/DemoPlayer.ExportJson");
var armature = ccs.Armature.create("DemoPlayer");
armature.setPosition(size.width / 2, size.height / 2);
armature.setScale(0.5);
lazyLayer.addChild(armature);
效果图:
您能否为我们提供一个整个Helloworld的zip,以便我们能更快的找到问题。
Best Regards
David
我自己用IIS整了本地web服务器,用chorme调了一下还是加载失败,cocos2d-html5 2.2.2 是重新下载的官方原版,这里地址是我从官网下载后直接上传百度云的链接http://pan.baidu.com/s/1c0w2zks,你可以比对一下hash md5什么的,或者beyondcompare也行
如果还不能复现,我做个视频传上去也许
要不把你能跑过的整个源码共享到百度云,h5的版本也就不到70m,我这边看看也行
谢谢您的反馈。
找到问题之原因:
我已修正这个问题。
请查看这个PR: https://github.com/cocos2d/cocos2d-html5/pull/1800
再次感谢。
David