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");


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值