cocos2d-x lua中实现异步加载纹理
2014-09-25 17:42
375 查看
前言
问题:最近项目中需要做一个loading个界面,界面中间有一个角色人物走动的动画,在显示这个loading界面的时候加载资源,项目是用cocos2d-x lua实现的,界面做出来后发现在加载资源的时候界面会卡住。原因: 因为使用的不是异步加载,而且cocos2d-x没有绑定异步加载资源的api到lua中,其实在lua中实现不了异步。
想通过在lua中启动一个线程去加载资源,但lua是不支持多线程的,只有协程,但并不是真正意义上的多线程,只不过是函数间执行权的相互交换。
解决思路:
把需要加载的资源的路径存放到一个CCArray中;
通过tolua++工具(查看tolua++工具的使用),在C++中绑定一个异步加载纹理的接口到lua中,该接口接收两个参数,参数一为CCArray(资源路径数组),参数二为int类型(lua回调函数)(点击查看C++回调Lua函数)
在绑定接口方法中迭代资源路径数组,使用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++方法实现异步加载资源。
相关文章推荐
- cocos2d-x lua中实现异步加载纹理
- cocos2d-x lua中实现异步加载纹理
- TexturePacker打包图片并使用addImageAsync实现longding界面异步加载图片纹理---cocos2d-x学习之路[3]
- TexturePacker打包图片并使用addImageAsync实现longding界面异步加载图片纹理---cocos2d-x学习之路
- 关于cocos2d-x进度条的实现和异步加载资源
- cocos2d中如何使用图片纹理图集的加载来实现一个动画的功能
- Cocos2d-x 异步加载纹理学习
- cocos2d-x异步加载纹理真地很渣
- js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
- Android实现ListView异步加载图片
- 实例讲解Android中如何实现图片的异步加载功能
- Android 如何实现ListView异步加载网络图片
- js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
- Android实现ListView异步加载图片 - ORIETech
- 如何实现ListView异步加载图片
- LABjs --- Javascript实现异步加载和阻塞
- 页面滚动时,异步加载的实现
- list多线程实现异步加载
- Android 实现ListView异步加载图片
- 编程技巧:用JQuery异步实现顺序加载外部脚本