Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39321
  • 博文数量: 17
  • 博客积分: 610
  • 博客等级: 上士
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-19 20:51
文章分类

全部博文(17)

文章存档

2015年(3)

2010年(11)

2009年(3)

我的朋友
最近访客

分类: C/C++

2015-02-09 17:32:51

二 加载Plist

我们可以在新开的线程中,加载资源,设置一个静态变量bool,在新线程中,当加载完所有资源后,设置bool值为真。在主线程中Update中,检测bool值,为假,可以重绘UI(例如,显示加载图片,或者模拟加载进度),为真,则加载目标场景。相关代码如下:


  1. void* LoadingScene::updateInfo(void* args){  
  2.      CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();  
  3.      cache->addSpriteFramesWithFile("BattleIcons.plist");  
  4.      cache->addSpriteFramesWithFile("ArcherAnim.plist");  
  5.      cache->addSpriteFramesWithFile("DeathReaperAnim.plist");  
  6.      loadComplete = true;  //状态值设为真,表示加载完成  
  7.      return NULL;  
  8. }  



成功加载且运行后,你会发现新场景中所有精灵都不显示(类似于黑屏了)。为什么呢?


因为我们在加载plist文件时,addSpriteFramesWithFile方法里会帮我们创建plist对应Png图的Texture2D,并将其加载进缓存中。可是这里就遇到了一个OpenGl规范的问题:不能在新开的线程中,创建texture,texture必须在主线程创建.通俗点,就是所有的opengl api都必须在主线程中调用;其它的操作,比如文件,内存,plist等,可以在新线程中做,这个不是cocos2d不支持,是opengl的标准,不管你是在android,还是windows上使用opengl,都是这个原理。

所以不能在新线程中创建Texture2D,导致纹理都不显示,那么该怎么办?让我们看看CCSpriteFrameCache源码,发现CCSpriteFrameCache::addSpriteFramesWithFile(const char *pszPlist, CCTexture2D *pobTexture)方法,是可以传入Texture2D参数的。是的,我们找到了解决方法:

相关代码如下:


  1. int LoadingScene::start(){  
  2.     CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage("BattleIcons.png"); //在这里(主线程中)加载plist对应的Png图片进纹理缓存  
  3.     CCTexture2D *texture2 = CCTextureCache::sharedTextureCache()->addImage("ArcherAnim.png"); //以这种方法加载的纹理,其Key值就是文件path值,即例如  
  4. texture2的key值就是ArcherAnim.png  
  5.     CCTexture2D *texture3 = CCTextureCache::sharedTextureCache()->addImage("DeathReaperAnim.png");  
  6.     pthread_create(&pid,NULL,updateInfo,NULL); //开启新线程  
  7.     return 0;  
  8. }  
  9. void* LoadingScene::updateInfo(void* args){  
  10.     CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();  
  11.     CCTextureCache* teCache = CCTextureCache::sharedTextureCache();     
  12.     CCTexture2D* texture1 = teCache->textureForKey("BattleIcons.png"); //从纹理缓存中取出Texure2D,并将其当参数传入addSpriteFramesWithFile方法中  
  13.     cache->addSpriteFramesWithFile("BattleIcons.plist",texture1);  
  14.     CCTexture2D* texture2 = teCache->textureForKey("ArcherAnim.png");  
  15.     cache->addSpriteFramesWithFile("ArcherAnim.plist",texture2);  
  16.     CCTexture2D* texture3 = teCache->textureForKey("DeathReaperAnim.png");  
  17.     cache->addSpriteFramesWithFile("DeathReaperAnim.plist",texture3);  
  18.     loadComplete = true;  
  19.     return NULL;  
  20. }  




这样解决,就不违背OpenGl规范,没有在新线程中创建Texture2D。

阅读(748) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~