转自:http://blog.csdn.net/we000636/article/details/8641270
实现多线程加载plist功能,需掌握知识:
1.多线程开启:pthread
2.如何在线程中加载plist
一.多线程开启
当我们想在程序中开多线程中,第一想到的是cocos2d-x有没有自带方法,幸运的是我们找到了CCThread,不幸却发现里面什么都没有。cocos2d-x自带了一个第三方插件--pthread,在cocos2dx\platform\third_party\win32\pthread可以找到。既然是自带的,必须它的理由。想在VS中应用这个插件需要两个步骤:
1.需要右键工程--属性--配置属性--链接器--输入--编缉右侧的附加依赖项--在其中添加pthreadVCE2.lib,如下图所示:
2..需要右键工程--属性--配置属性--C/C++--常规--编缉右侧的附加包含目录--添加新行--找到pthread文件夹所在位置,如下图所示:
然后我们就可以应用这个插件在程序中开启新线程,简单线程开启方法如下代码所示:
头文件:
-
#ifndef_LOADING_SCENE_H__
-
#define_LOADING_SCENE_H__
-
-
#include"cocos2d.h"
-
#include"pthread/pthread.h"
-
classLoadingScene:publiccocos2d::CCScene{
-
public:
-
virtualboolinit();
-
CREATE_FUNC(LoadingScene);
-
intstart();
-
voidupdate(floatdt);
-
private:
-
pthread_tpid;
-
staticvoid*updateInfo(void*args);
-
};
cpp文件
-
#include"LoadingScene.h"
-
#include"pthread/pthread.h"
-
-
usingnamespacecocos2d;
-
boolLoadingScene::init(){
-
this->scheduleUpdate();
-
start();
-
returntrue;
-
}
-
voidLoadingScene::update(floatdt){
-
-
}
-
void*LoadingScene::updateInfo(void*args){
-
-
returnNULL;
-
}
-
intLoadingScene::start(){
-
pthread_create(&pid,NULL,updateInfo,NULL);
-
return0;
-
}
二 加载Plist
我们可以在新开的线程中,加载资源,设置一个静态变量bool,在新线程中,当加载完所有资源后,设置bool值为真。在主线程中Update中,检测bool值,为假,可以重绘UI(例如,显示加载图片,或者模拟加载进度),为真,则加载目标场景。相关代码如下:
-
void*LoadingScene::updateInfo(void*args){
-
CCSpriteFrameCache*cache=CCSpriteFrameCache::sharedSpriteFrameCache();
-
cache->addSpriteFramesWithFile("BattleIcons.plist");
-
cache->addSpriteFramesWithFile("ArcherAnim.plist");
-
cache->addSpriteFramesWithFile("DeathReaperAnim.plist");
-
loadComplete=true;
-
returnNULL;
-
}
成功加载且运行后,你会发现新场景中所有精灵都不显示(类似于黑屏了)。为什么呢?
因为我们在加载plist文件时,addSpriteFramesWithFile方法里会帮我们创建plist对应Png图的Texture2D,并将其加载进缓存中。可是这里就遇到了一个OpenGl规范的问题:不能在新开的线程中,创建texture,texture必须在主线程创建.通俗点,就是所有的openglapi都必须在主线程中调用;其它的操作,比如文件,内存,plist等,可以在新线程中做,这个不是cocos2d不支持,是opengl的标准,不管你是在android,还是windows上使用opengl,都是这个原理。
所以不能在新线程中创建Texture2D,导致纹理都不显示,那么该怎么办?让我们看看CCSpriteFrameCache源码,发现CCSpriteFrameCache::addSpriteFramesWithFile(const char *pszPlist, CCTexture2D *pobTexture)方法,是可以传入Texture2D参数的。是的,我们找到了解决方法:
相关代码如下:
-
intLoadingScene::start(){
-
CCTexture2D*texture=CCTextureCache::sharedTextureCache()->addImage("BattleIcons.png");
-
CCTexture2D*texture2=CCTextureCache::sharedTextureCache()->addImage("ArcherAnim.png");
-
texture2的key值就是ArcherAnim.png
-
CCTexture2D*texture3=CCTextureCache::sharedTextureCache()->addImage("DeathReaperAnim.png");
-
pthread_create(&pid,NULL,updateInfo,NULL);
-
return0;
-
}
-
void*LoadingScene::updateInfo(void*args){
-
CCSpriteFrameCache*cache=CCSpriteFrameCache::sharedSpriteFrameCache();
-
CCTextureCache*teCache=CCTextureCache::sharedTextureCache();
-
CCTexture2D*texture1=teCache->textureForKey("BattleIcons.png");
-
cache->addSpriteFramesWithFile("BattleIcons.plist",texture1);
-
CCTexture2D*texture2=teCache->textureForKey("ArcherAnim.png");
-
cache->addSpriteFramesWithFile("ArcherAnim.plist",texture2);
-
CCTexture2D*texture3=teCache->textureForKey("DeathReaperAnim.png");
-
cache->addSpriteFramesWithFile("DeathReaperAnim.plist",texture3);
-
loadComplete=true;
-
returnNULL;
-
}
这样解决,就不违背OpenGl规范,没有在新线程中创建Texture2D。
分享到:
相关推荐
cocos2d-x异步加载plist cocos2d-x v2.2.0
简单跑酷,入门范例,分享他人,共同学习。内含plist合成图,地图拼接等,欢迎探讨学习!满意请给五星。。。
cocos2d-x来加载资源,除了常用的方法之外,我们还可以用plist来创建一个资源组,这样不仅在加载多个资源是方便,而且还利于管理,那么怎么使用plist呢,下面我就举一个简单的例子,来和大家共同学习一下plist。
这个资源包提供了两个类,这两个类分别可以读取plist的文件和xml的文件,对文件中的字段...所用的版本是cocos2d-x 3.0 bate版本,代码中有用到 CPubFun::系列的函数,是自己封装的,用可以可以用c++基本的函数来替换。
cocos2d-x的动画资源素材,在cocos2d-x中添加如下代码使用: //动画 //创建一个缓存 auto cache = SpriteFrameCache::getInstance(); //先把图片读入内存 cache->addSpriteFramesWithFile("anim.plist"); ...
cocos2d-x粒子编辑器,可以自己制作.pList格式的粒子文件...
本项目支持单人游戏,双人对战游戏,死亡复活,以及多种样式的水管.大大增加了游戏的可玩性. 开发难度也相对简单,适合对 ... 项目使用 c++,基于 cocos2d-x-x 引擎开发,开发工具为 Xcode8.1,支持 Android,iOS 以及 wp 系统.
physicsEditor的接口文件,因cocos2d-x版本变更无法适配,故修改之
一张纹理和与其对应的Plist在COCOS2D-X中使用
Particle-System.plist to Code for cocos2d-x (ver 3.x) 描述 将 ParticleSystem.plist 转换为 cocos2d-x v3.x 的源代码! 将粒子配置文件 (.plist) 转换为 cocos2d-x v3.x 的代码。由于可以消除运行时的文件读取...
内包含cocos2d 图片UI基本素材 非plist 带音效
Swifty-pList - 一个Swift 3 pList 库用于读和写 pLists 配置
app-ipa-down.plist
查看cocos2d-x所使用的plist图片资源的工具。
基于线程安全的 plist 文件管理类
使用coco2d-x的Box2d物理引擎时,用PhysicsEditor编辑器可以方便的导出需要的物体...因为cocos2d-x更新太快原来的GB2ShapeCache-x无法解析出导出的plist了。这个版本的 GB2ShapeCache-x,亲测,适用于cocos2d-x2.2.4。
自用的动画编辑器,没有Plist那样的高效和高利用率,但是可以方便的将6R上面零碎的素材变成你想要的动画
最新-汽车品牌及车型plist.zip 自己整理,希望帮到大家。
iOS 2016年最新的省市区plist文件
基于cocos2d-x 2.2.6开发的plist大图还原小图工具 Usage: PlistParser.exe plistName pngName savePath 例如: C:\>PlistParser.exe res\chip.plist res\chip.png output