Oppo小游戏广告 无后缀名图片加载

Cocos Creator 2.4.x亲测有效。

有点hack的方式,在oppo上无后缀名的话,默认会用.jpg还是啥的方式,去下载,这个时候使用的解析器,下载器是有问题的。图片下载不下来。

那么我们可以模拟Cocos的方式,给无后缀URL(图片)指定特殊的解析器,下载器。我们把特殊无后缀名的图片后缀设置为 .noextpic,然后给他指定对应的解析器,下载器。

代码如下:
第一点:给URL添加后缀名,.noextpic。

 // 没有后缀名,oppo单独处理, .noextpic是我们自己注册的一个资源下载处理

        let type = cc.path.extname(url);
        if (!cc.macro.SUPPORT_TEXTURE_FORMATS.includes(type)) {

            if (hf.platformMgr.isOppoGame) {

                type = ".noextpic";

            }

            else {

                type = ".jpg";

            }

        }

第二点:给.noextpic注册解析器。

     * 无后缀图片下载、解析注册器

     */

    public registNoExtDownloaderAndParser(): void {

        cc.assetManager.parser.register(".noextpic", cc.assetManager.parser['parseImage']);

        cc.assetManager.downloader.register(".noextpic", cc.assetManager.downloader['downloadDomImage']);

        cc.assetManager['factory']['register'](".noextpic", this.createTexture);

    }
2赞

第二点补充一个函数 this.createTexture
/**

 * 图片生成

 */

private createTexture(id: string, data: any, options?: any, onComplete?: (err: Error, out: any) => void) {

    let out = null, err = null;

    if (typeof options == "function" && !onComplete) {

        onComplete = options;

    }

    try {

        out = new cc.Texture2D();

        out._nativeUrl = id;

        out._nativeAsset = data;

    }

    catch (e) {

        err = e;

    }

    onComplete && onComplete(err, out);

}

没用,https://pgdt.ugdtimg.com/gdt/0/EABX6ncAEsAEsAAAGvsBhy8VBC28tuVv_.jpg/0?ck=85917e63bcd5f362f89335b9ec926a84
不知道是我使用你代码问题还是如何,能写个完整的调用吗

你是用的2.x还是3.x?

上面时2.4.x的写法,下面附上3.x的方法。
/**

     * 无后缀图片下载、解析注册器

     */

    export function registNoExtDownloaderAndParser(): void {

        cc.assetManager.parser.register(".noextpic", cc.assetManager.parser.parseImage);

        cc.assetManager.downloader.register(".noextpic", cc.assetManager.downloader.downloadDomImage);

        cc.assert(!!cc.assetManager['factory']['_producers'], "LoadMgr 底层变量已修改,请查看引擎源码调整变量名称")

        cc.assetManager['factory']['register'](".noextpic", cc.assetManager['factory']['_producers']['.jpg']);

    }

游戏启动的时候调用上面的regist注册一下。下面是下载图片的代码。

private updateAdSprite(url: string) {

        if (!url) return;

        let type = path.extname(url);

        // 没有后缀名,oppo单独处理, .noextpic是我们自己注册的一个资源下载处理

        if (macro.SUPPORT_TEXTURE_FORMATS.indexOf(type) === -1) {

            if (hf.platform.isOppoGame) {

                type = ".noextpic";

            }

            else {

                type = ".jpg";

            }

        }

        assetManager.loadRemote(url, { ext: type || ".jpg" }, (err: Error, img: ImageAsset) => {

            if (err) {

                console.error("【自渲染广告】: load texture err =" + err.message, url, type);

            }

            else {

                console.log("【自渲染广告】:  load texture success !", url);

                if (this.node.isValid && this.spAd.isValid) {

                    this.spAd.spriteFrame && this.spAd.spriteFrame.decRef();

                    this.spAd.spriteFrame = SpriteFrame.createWithImage(img);

                }

            }

        });

    }