cocos2d-x lua中实现异步加载纹理

前言


    问题:最近项目中需要做一个loading个界面,界面中间有一个角色人物走动的动画,在显示这个loading界面的时候加载资源,项目是用cocos2d-x lua实现的,界面做出来后发现在加载资源的时候界面会卡住。


   原因: 因为使用的不是异步加载,而且cocos2d-x没有绑定异步加载资源的api到lua中,其实在lua中实现不了异步。


    想通过在lua中启动一个线程去加载资源,但lua是不支持多线程的,只有协程,但并不是真正意义上的多线程,只不过是函数间执行权的相互交换。


    解决思路:

  1. 把需要加载的资源的路径存放到一个CCArray中;
  2. 通过tolua++工具(查看tolua++工具的使用),在C++中绑定一个异步加载纹理的接口到lua中,该接口接收两个参数,参数一为CCArray(资源路径数组),参数二为int类型(lua回调函数)(点击查看C++回调Lua函数    
  3. 在绑定接口方法中迭代资源路径数组,使用CCTextureCache的addImageAsync方法加载纹理,当资源加载完成时回调lua方法



示例代码


1.编写绑定到Lua中异步资源加载接口类


AsynResLoader.h

#ifndef  _ASYNRESLOADER_H_
#define _ASYNRESLOADER_H_

#include "cocos2d.h"

USING_NS_CC;

//供Lua调用的异步的资源加载器
class AsynResLoader: public CCObject
{
private:	
	int count;
	int total;
	//lua回调方法
	int mLuaCallback;
public:
	//创建一个异步资源加载器
	static AsynResLoader* create();
	//异步加载纹理
	void asynLoadTexture(CCArray* paths, int luaCallbck);
	//加载回调
	void callback(CCObject* pSender);
};

#endif

AsynResLoader.cpp

#include "AsynResLoader.h"
#include "CCLuaEngine.h"  

//创建一个异步资源加载器
AsynResLoader* AsynResLoader::create(){
	AsynResLoader* instance = new AsynResLoader;
	if (instance)
	{
		instance->autorelease();
		return instance;
	}
	return NULL;
}

//异步加载纹理
void AsynResLoader::asynLoadTexture(CCArray* paths, int luaCallback){	
	this->count = 0;
	this->total = paths->count();
	this->mLuaCallback = luaCallback;
	
	for(int idx = 0; idx <total; idx++)
	{
		const char* path = ((CCString*)paths->objectAtIndex(idx))->getCString();		
		CCLOG("asynLoadTexture PATH idx=%d : %s",idx,path);
		CCTextureCache::sharedTextureCache()->addImageAsync(path, this, callfuncO_selector(AsynResLoader::callback));
	}
}

//纹理加载回调方法
void AsynResLoader::callback(CCObject*){			
	this->count++;
	//当资源加载完成时,回调指定的lua函数
	if (this->count >= this->total)
	{
		CCLOG("asyn load res completed..");
		if (this->mLuaCallback)
		{			
			CCLuaStack* pStack = CCLuaEngine::defaultEngine()->getLuaStack();
			//第一个参数是函数的整数句柄,第二个参数是函数参数个数
			pStack->executeFunctionByHandler(this->mLuaCallback,0);
			pStack->clean();
			CCLOG("call lua function..");
		}
	}
}


2.使用tolua++工具把类绑定到lua中(点击查看使用方法


3.在lua中创建资源路径数组,调用接口方法,把路径数组和回调函数传递进去


lua代码:

function asynLoadTexture(callback)
    local pngs = CCArray:create()
    -- Buff动画帧路径    
    for _, anim in ipairs(buff_anim_config.buff_anim_config) do
        pngs:addObject(CCString:create(anim.png))
    end
    -- 技能动画帧路径
    for k, anim in ipairs(skill_anim_config.skill_anim_config) do
        pngs:addObject(CCString:create(anim.png))
    end
    AsynResLoader:create():asynLoadTexture(pngs,callback)
end


4.运行效果


实质就是lua调用C++方法实现异步加载资源。


posted on 2014-09-25 17:42  linchaolong  阅读(2092)  评论(0编辑  收藏  举报

导航