zoukankan      html  css  js  c++  java
  • cocos2d-x lua中实现异步加载纹理

    原文地址:  http://www.cnblogs.com/linchaolong/p/4033118.html

    前言

        问题:最近项目中需要做一个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++方法实现异步加载资源。


      

  • 相关阅读:
    第二阶段冲刺总结01
    第十四周学习进度
    第十三周进度
    意见改进
    BZOJ 2109 航空管制(拓扑排序+贪心)
    BZOJ 2131 圈地计划(最小割+黑白染色)
    BZOJ 2118 墨墨的等式(最短路)
    BZOJ 2157 旅行(树链剖分码农题)
    BZOJ 2141 排队(树状数组套主席树)
    BZOJ 2186 沙拉公主的困惑(预处理逆元+欧拉函数)
  • 原文地址:https://www.cnblogs.com/mokey/p/5664768.html
Copyright © 2011-2022 走看看