前言

Cocos2d-x 默认不支持加载网络图片,而加载网络图片是一个常见的需求,本文简单的实现了加载网络图片。

加载网路图片

加载一张网络图片需要以下几个步骤

  1. 从网络上把图片的二进制数据下载下来
  2. 使用图片的二进制数据创建 Image 对象
  3. 用创建好的 Image 对象初始化 Texture2D 对象
  4. 使用 Texture2D 对象创建一个精灵
  5. 把精灵添加到节点中
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
auto request = new cocos2d::network::HttpRequest();
request->setUrl(url);
request->setRequestType(cocos2d::network::HttpRequest::Type::GET);
request->setResponseCallback([=](cocos2d::network::HttpClient* client,
cocos2d::network::HttpResponse* response) {
    if (!response) {
        return;
    }

    if (!response->isSucceed()) {
        return;
    }

    std::vector<char> data;
    auto responseData = response->getResponseData();
    data.assign(responseData->begin(), responseData->end()); // 获取二进制数据

    auto image = new Image(); // 创建 Image对象
    image->initWithImageData(reinterpret_cast<unsigned char*>(data.data()), data.size()); // 填充图片数据

    auto texture = new Texture2D();
    bool isImage = texture->initWithImage(image); // 使用 Image 初始化 Texture2D
    if (!isImage) {
        texture->release();
        image->release();
        return ;
    }

    auto sprite = Sprite::createWithTexture(texture); // 使用 Texture2D 创建精灵
    sprite->setContentSize(Size(200, 200));
    sprite->setAnchorPoint(Vec2(0, 0));
    addChild(sprite); // 把精灵添加到节点中

    texture->release();
    image->release();
});

cocos2d::network::HttpClient::getInstance()->sendImmediate(request);
request->release();

总结

通过以上的步骤,就可以在 Cocos2d 中加载网络图片并显示出来。

可以看到加载一张网络图片还是比较麻烦的,最好是自己封装一下,不然要用的地方每次都写一遍非常不好维护。

参考