cocos2d-x 3.3 之卡牌设计 NO.6 Loading界面(异步加载图片,plist)

刚开始做卡牌的时候没有想到要做loading,因为小游戏资源不多。

但是后来不断的加图片,直到在真机上发现卡顿的问题,我才知道该需要加loading了......

首先,我们先定义类:

class Loading : public Layer
{
public:
	bool init();
	CREATE_FUNC( Loading);
	static Scene* CreateScene();

	int total_pic_num;//需加载图片数
	int total_sound_num;//需加载声音数
	int all_num;//总共需要加载的数量
	int load_num;//已加载数量
	std::vector<std::string> plist_name;//plist名
	int load_plist_num;//加载了几个plist

	void load_sound(int num);
	void load_pic(Object* pSender);
	void load_plist(Object* pSender);

};

在cpp中先初始化一些参数:

total_pic_num=BACKGROUND_NUM+CARD_HERO_NUM+CARD_EQUIP_NUM+CARD_BACK_NUM+BUTTON_ACTION_NUM+TOUCH_ACTION_NUM+CARD_SKILL_NUM;
total_sound_num=BGM_NUM+EFFECT_NUM;
all_num=total_pic_num+total_sound_num;
load_num=0;
load_plist_num=0;

//plist名
plist_name.push_back("UI/button_action/button_action");
plist_name.push_back("UI/touch_action/touch_act_three");
plist_name.push_back("skill/atk/flame");
plist_name.push_back("skill/atk/freeze");
plist_name.push_back("skill/atk/lightning");
plist_name.push_back("skill/atk/wind");

然后开始加载资源吧:

//-------------------------------------------------------------预加载背景音乐

	CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("sound/bgm/bgm_start.mp3");
	CocosDenshion::SimpleAudioEngine::getInstance()->preloadBackgroundMusic("sound/bgm/bgm_game.mp3");
	load_sound(BGM_NUM);

//-------------------------------------------------------------预加载音效

	CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/effect/button_1.mp3");

	//攻击音效

	CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/effect/button_out.mp3");
	CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/effect/flame_shoot.mp3");
	CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/effect/freeze_shoot.mp3");
	CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/effect/lightning_shoot.mp3");
	CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/effect/wind_shoot.mp3");

	//控制音效

	CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/effect/open_card.mp3");
	CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/effect/card_out.mp3");
	CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/effect/equip_out.mp3");
	CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/effect/no.mp3");
	CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sound/effect/card_die.mp3");
	load_sound(EFFECT_NUM);

//-------------------------------------------------------------背景
	CCTextureCache::sharedTextureCache()->addImageAsync("UI/background/background_start.jpg", CC_CALLBACK_1(Loading::load_pic, this));
	CCTextureCache::sharedTextureCache()->addImageAsync("UI/background/background_help.jpg",CC_CALLBACK_1(Loading::load_pic, this));
	CCTextureCache::sharedTextureCache()->addImageAsync("UI/background/background_about.jpg",CC_CALLBACK_1(Loading::load_pic, this));
	CCTextureCache::sharedTextureCache()->addImageAsync("UI/background/help_word.jpg",CC_CALLBACK_1(Loading::load_pic, this));
	CCTextureCache::sharedTextureCache()->addImageAsync("UI/background/background_game.jpg",CC_CALLBACK_1(Loading::load_pic, this));
	CCTextureCache::sharedTextureCache()->addImageAsync("UI/background/setting_back.png",CC_CALLBACK_1(Loading::load_pic, this));
	CCTextureCache::sharedTextureCache()->addImageAsync("UI/background/setting_face.png",CC_CALLBACK_1(Loading::load_pic, this));
	CCTextureCache::sharedTextureCache()->addImageAsync("UI/background/title.png",CC_CALLBACK_1(Loading::load_pic, this));

//-------------------------------------------------------------卡牌
	//back
	char file_name_c[100];
	for(int i=0;i<=CARD_BACK_NUM;i++)
	{
		sprintf(file_name_c,"card/back/card_need_magic_%d.jpg",i);
		std::string	file_name(file_name_c);
		CCTextureCache::sharedTextureCache()->addImageAsync(file_name, CC_CALLBACK_1(Loading::load_pic, this));
	}
	//equip
	for(int i=0;i<=CARD_EQUIP_NUM;i++)
	{
		sprintf(file_name_c,"card/equip/card_equip_%d.jpg",i);
		std::string	file_name(file_name_c);
		CCTextureCache::sharedTextureCache()->addImageAsync(file_name, CC_CALLBACK_1(Loading::load_pic, this));
	}

	//hero
	for(int i=0;i<=CARD_HERO_NUM;i++)
	{
		sprintf(file_name_c,"card/people/card_hero_%d.jpg",i);
		std::string	file_name(file_name_c);
		CCTextureCache::sharedTextureCache()->addImageAsync(file_name, CC_CALLBACK_1(Loading::load_pic, this));
	}

//-------------------------------------------------------------加载精灵表
	for(std::string a : plist_name)
	{
		CCTextureCache::sharedTextureCache()->addImageAsync(a+".png", CC_CALLBACK_1(Loading::load_plist, this));
		//load_plist_num++;
	}

注意加载图片和精灵表的回调函数是不一样的,因为加载这两种资源需要不同的方式

以下为一个自定义函数和两个回调函数(用于动态显示加载进度和加载):

void Loading::load_sound(int num)//这个函数可以忽略不看
{
	load_num+=num;
	int percent=((float)load_num/(float)all_num)*100;
	auto loading_font = (Label*)getChildByTag(1);
	loading_font->setString(String::createWithFormat("Loading......%d%%",percent)->_string);
}
void Loading::load_pic(Object* pSender)//加载图片的回调函数
{
	load_num+=1;
	int percent=((float)load_num/(float)all_num)*100;
	this->runAction(DelayTime::create(15));//休息
	auto loading_font = (Label*)getChildByTag(1);
	loading_font->setString(String::createWithFormat("Loading......%d%%",percent)->_string);

	if(percent>=100)
	{
		Director::getInstance()->replaceScene(Start::CreateScene());//如果加载完成跳转
	}

}
void Loading::load_plist(Object* pSender)//加载精灵表的回调函数
{
	SpriteFrameCache::getInstance()->addSpriteFramesWithFile(plist_name.at(load_plist_num)+".plist",plist_name.at(load_plist_num)+".png");//图片已经加载过貌似会直接从缓存中读取,目的是把图片和plist一起加载
	load_plist_num++;
	this->runAction(DelayTime::create(15));
	load_num+=1;
	int percent=((float)load_num/(float)all_num)*100;
	this->runAction(DelayTime::create(15));
	auto loading_font = (Label*)getChildByTag(1);
	loading_font->setString(String::createWithFormat("Loading......%d%%",percent)->_string);

	if(percent>=100)
	{
		Director::getInstance()->replaceScene(Start::CreateScene());
	}

}

如上就是异步加载的方法,现在我们需要知道如何从缓存中获取:

获取图片:

Sprite *BK=Sprite::createWithTexture(TextureCache::sharedTextureCache()->textureForKey("UI/background/background_start.jpg"));  

获取精灵表:

CCSpriteFrameCache *frameCache=CCSpriteFrameCache::sharedSpriteFrameCache();
frameCache->getSpriteFrameByName("UI/touch_action/touch_act_three.plist");

这样就能从缓存中获取资源了,我测试了下真的快很多

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 21:24:43

cocos2d-x 3.3 之卡牌设计 NO.6 Loading界面(异步加载图片,plist)的相关文章

Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

转载请注明出处http://blog.csdn.net/xiaanming/article/details/9825113 异步加载图片的例子,网上也比较多,大部分用了HashMap<String, SoftReference<Drawable>> imageCache ,但是现在已经不再推荐使用这种方式了,因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠.另外,Android 3.0

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计

扩展于RCLabel的支持异步加载网络图片的富文本引擎的设计 在iOS开发中,图文混排一直都是UI编程的一个核心点,也有许多优秀的第三方引擎,其中很有名的一套图文混排的框架叫做DTCoreText.但是在前些日的做的一个项目中,我并没有采用这套框架,原因有二,一是这套框架体积非常大,而项目的需求其实并不太高:二是要在这套框架中修改一些东西,难度也非常大,我最终采用的是一个叫做RCLabel的第三方控件,经过一些简单的优化和完善,达到了项目的要求. 先来介绍一下我项目中的图文混排的需求:首先我从服

为什么SDWebImage加载图片就不卡呢?

在之前我们做图片异步加载的时候经常会遇到在滑动tableView的时候卡顿的情况,但是我们确实是在子线程下载并创建UIImage对象然后才在主线程进行现实的,而用SDWebImage的时候就不会卡呢,其实仔细研究一下它的代码就很容易发现了: #import "SDWebImageDecoder.h" @implementation UIImage (ForceDecode) + (UIImage *)decodedImageWithImage:(UIImage *)image { if

cocos2d-x 3.3 之卡牌设计 NO.4 定时器的使用(清理内存)

我的卡牌游戏卡牌有两个类,分别是OpenCard和CardSprite. 不知道分成两个是不是有些奇怪,我分开的原因是:一个卡牌用来当手牌,一个用来当场上的牌,这样说是不是更加奇怪了.. 玩家类里定义了两个容器,分别存放两种卡牌类: Vector<CardSprite *> cardSprite;//卡牌精灵容器 Vector<OpenCard *> openSprites;//翻转卡牌精灵容器 游戏开始: 1.调用函数player_1->player_deal_cards(

cocos2d-x 3.3 之卡牌设计 NO.3 卡牌移动

上次说了如何播放卡牌翻转的动画,卡牌翻到正面后,就需要让玩家将卡牌拖拽至出场区域或者墓地区域了. 这里重复一下之前的内容: 1.重载触控函数: virtual bool onTouchBegan(Touch* touch, Event* event); virtual void onTouchMoved(Touch* touch, Event* event); virtual void onTouchEnded(Touch* touch, Event* event); 2.在init里添加: /

React Image加载图片过大导致ListView滑动卡顿

今天莫名的发现ListView加载Item很卡,一顿一顿的... ListView Item 中只加载一张图片,小编从百度爸爸上随便复制的链接,这张图片很大,以致埋下如此大坑... Image的Style配置如下: 我们来下看官方对于reSizeMode的解释: 经过多次测试确实是因为reSizeMode设置成 contain 导致的,如果我将reSizeMode去掉如下: 完全OK 没问题... 唯一能解释的就是:contain属性下,图片拉伸导致性能降低... 记录此问题,防坑~~~

系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构

系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这个实体有关联关系. 3,每个实体中都有什么属性? 1,主键.推荐使用代理主键 2,关联关系属性.在类图中,关联关系是一条线,有两端,每一端对应一个表达此关联关系的属性.有几个端指向本类,本类中就有几个关联关系属性. 3,一般属性.分析所有有关的页面,找出表单中要填写的或是在显示页面中要显示的信息等.

加载图片和6.0SD卡读写权限

转载请标明出处: :http://blog.csdn.net/huaiyiheyuan/article/details/52473984 一.Semaphore(信号量) 1.先来了解一下这个玩意儿,Semaphore semp = new Semaphore(5); 这 里设置的可以访问的资源个数为5. 2.copy介绍 : Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等

前端设计中关于外部js文件加载的速度优化

在一般情况下,许多人都是将<script>写在了<head>标签中,而许多浏览器都是使用单一的线程来加载js文件的,从上往下,从左往右. 若是加载过程出错,那么网页就会阻塞,就像许多网站用Google的CDN库,而我们在墙内访问一样.页面不会出来,一直加载这个js文件,直到浏览器放弃加载为止! 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default