cocos2dx 3.x lua http请求网络图片,自己封装的,很好用,需要的可以看看

绑定了一个c++函数到lua,lua这边是这样调用的:

—测试 http请求网络图片 的代码
local function HttpRequestCompleted(statusCode,tagNum,image)
print(“图片数据请求结果 statusCode:”…statusCode…" tag:"…tagNum)

—200表示获取网络图片成功,否则失败
if statusCode==200 then

        local texture=cc.Texture2D:new()
        texture:initWithImage(image)
        local sp_goodsItem=cc.Sprite:createWithTexture(texture)  --直接创建请求的网络图片精灵,不用再保存到本地,很方便的

    end

end
---最后一个参数是tag值,缺省是-1,这个参数与回调函数HttpRequestCompleted的第2个参数对应

CUserData:ShareUserData():requestGoodsImageFromWeb(“http://h.hiphotos.baidu.com/zhidao/pic/item/5bafa40f4bfbfbed0470471b78f0f736afc31fac.jpg”,HttpRequestCompleted,123)

c++实现如下:
void CUserData::requestGoodsImageFromWeb(std::string strUrl,int callback,int tag)
{
if (strUrl.length()==0 || callback==0)
{
return;
}

HttpRequest* request = new HttpRequest();
request->setRequestType(HttpRequest::Type::GET);
request->setUrl(strUrl.c_str());
request->setResponseCallback(std::bind(&CUserData::onHttpRequestCompleted_head, this,std::placeholders::_1,std::placeholders::_2,callback,tag));

HttpClient::getInstance()->send(request);
request->release();

}

void CUserData::onHttpRequestCompleted_head(HttpClient *sender, HttpResponse *response,int callback,int tag)
{
if (response && response->isSucceed())
{
log(“response code: %ld”, response->getResponseCode());

    // 打印接收到的字符串
    std::vector<char> *buffer = response->getResponseData();
    std::string bufffff(buffer->begin(),buffer->end());
    log("%s", bufffff.c_str());

    if (callback!=0) {
        LuaStack *stack = LuaEngine::getInstance()->getLuaStack();
        stack->pushInt(200);
        stack->pushInt(tag);
        auto img=new Image;
        img->autorelease();
        img->initWithImageData((const unsigned char *)buffer->data(), buffer->size());
        stack->pushObject(img, "Image");
        stack->executeFunctionByHandler(callback, 3);  //执行lua函数
        stack->clean();

    }

    return;
}


if (response){
    log("response code: %ld", response->getResponseCode());
    log("error buffer: %s", response->getErrorBuffer());
}

if (callback!=0) {
    LuaStack *stack = LuaEngine::getInstance()->getLuaStack();
    stack->pushInt(0);
    stack->pushInt(tag);
    stack->executeFunctionByHandler(callback, 2);  //执行lua函数
    stack->clean();

}

}

绑定到lua的代码如下:
int lua_cocos2dx_custom__CUserData_requestGoodsImageFromWeb(lua_State* tolua_S)
{
int argc = 0;
cocos2d::CUserData* cobj = nullptr;
bool ok = true;

#if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
#endif

#if COCOS2D_DEBUG >= 1
if (!tolua_isusertype(tolua_S,1,“cc.CUserData”,0,&tolua_err)) goto tolua_lerror;
#endif

cobj = (cocos2d::CUserData*)tolua_tousertype(tolua_S,1,0);

#if COCOS2D_DEBUG >= 1
if (!cobj)
{
tolua_error(tolua_S,“invalid ‘cobj’ in function ‘lua_cocos2dx_custom__CUserData_requestGoodsImageFromWeb’”, nullptr);
return 0;
}
#endif

argc = lua_gettop(tolua_S)-1;
if (argc == 2)
{
    std::string arg0;
    int arg1;

    ok &= luaval_to_std_string(tolua_S, 2,&arg0);

    arg1=toluafix_ref_function(tolua_S, 3, 0);
    if(!ok)
        return 0;
    cobj->requestGoodsImageFromWeb(arg0, arg1);
    return 0;
}else if (argc == 3)
{
    std::string arg0;
    int arg1;
    int arg2;

    ok &= luaval_to_std_string(tolua_S, 2,&arg0);

    arg1=toluafix_ref_function(tolua_S, 3, 0);

    ok &= luaval_to_int32(tolua_S, 4, &arg2);
    if(!ok)
        return 0;
    cobj->requestGoodsImageFromWeb(arg0, arg1,arg2);
    return 0;
}
CCLOG("%s has wrong number of arguments: %d, was expecting %d \n", "requestGoodsImageFromWeb",argc, 2);
return 0;

#if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function ‘lua_cocos2dx_custom__CUserData_requestGoodsImageFromWeb’.",&tolua_err);
#endif

return 0;

}

1赞

:7: 强哥给你支持

谢谢分享:14:

其实最主要是将网络传来的图片数据用initWithImageData来转为可用的image,如果把这个功能单独写的话,那么就可以在lua端直接调用,即便不是用HTTP协议传来的也可以进行处理了

是的,暂时这样解决了,很想单纯的用lua的http来实现,但是没法:2::2::2:

您好,我想问下怎么将c++绑定到lua呢?

这个教程很多的,官方例子有的

但是我还是没有搞好,而且input 组件在安卓机上显示也不对,你有遇到这样的问题吗

输入框 是cocos封装好了的,这个你不用在意其界面如何

我用的是quick框架,现在打包在真机上显示不对啊,输入框跑到最顶端了啊

android上是这样的效果啊

是啊,我qq:416105839,能加你qq聊吗?

:8:哈哈,好,终于找到了。

:2: :2: :2: :2: :2: :2: :2:

local texture=cc.Texture2D:new() 请问下这个是在lua中定义的??

哦 我知道了

哦哦 :2: :2: :2: :2: :2: :2: :2: :2:

我已经转行了,没做cocos了