动态合图我要死了

有没有巨佬路过~~~
请问用数组生成图片,代码如下,为什么不能开启动态合图呢,开启的话会报下面这样的错误?昨天问过一个相似的问题,本来是想用一个大数组把小图片的数组全都包含进去,后来因为一些其他的原因发现做不到,又回来想办法动态合图来了。。。额。。。。。

function ArrayToSpriteFrame(buffer: Uint8Array, width: number, height: number): SpriteFrame | null {
// 生成一张新的图来进行替换
let imageAsset: ImageAsset = new ImageAsset();
imageAsset.reset({
_data: buffer,
width: width,
height: height,
format: Texture2D.PixelFormat.RGBA8888,
_compressed: false
});
let tex: Texture2D = new Texture2D();
tex.image = imageAsset;
let spriteFrame = new SpriteFrame();
spriteFrame.texture = tex;
spriteFrame.packable = true;
// 返回新的图
return spriteFrame;
}

Uncaught TypeError: Failed to execute ‘texSubImage2D’ on ‘WebGL2RenderingContext’: Overload resolution failed.

6赞

别沉啊。。。兄弟们。。。。。

大佬啊,你这个ArrayToSpriteFrame写的好啊,我刚好需要。

1赞

同样遇到这样的问题

动态合批此处代码有问题,没对image.data做类型判断,加下判断即可:

       /**
         * @en
         * Draw a texture to the specified position.
         *
         * @zh
         * 将指定的图片渲染到指定的位置上。
         *
         * @method drawTextureAt
         * @param {Texture2D} image
         * @param {Number} x
         * @param {Number} y
         */
        public drawTextureAt (image: ImageAsset, x: number, y: number) {
            const gfxTexture = this.getGFXTexture();
            if (!image || !gfxTexture) {
                return;
            }
            const gfxDevice = this._getGFXDevice();
            if (!gfxDevice) {
                console.warn('Unable to get device');
                return;
            }
            const region = new BufferTextureCopy(), imageData = image.data;
            region.texOffset.x = x;
            region.texOffset.y = y;
            region.texExtent.width = image.width;
            region.texExtent.height = image.height;
            if (ArrayBuffer.isView(imageData)) {
                gfxDevice.copyBuffersToTexture([imageData], gfxTexture, [region]);
            }
            else {
                gfxDevice.copyTexImagesToTexture([imageData as TexImageSource], gfxTexture, [region]);
            }
        }
6赞

这不得合并到引擎?建议去 git 上提交一波

我居然没看懂。

大佬这不得在3.x版本也提交一波git?

不是大佬,让官方的人去搞吧,俺懒:rofl:

@jare

        const img = new Image();
        img.onload = function (info) {
          //create imageasset and spriteframe

        };
        img.onerror = () => {
           //
        };
        img.src = base64Src;

试试这种方式,兼容性好一点

你这是兼容性倒退,原生能用吗?

原生3上没用过,我去试试

Image 是浏览器用的,只要 cocos 没重载就没有这个玩意儿

import { _decorator, Component, Node, ImageAsset, assetManager, SpriteFrame, Texture2D, Sprite } from ‘cc’;
const { ccclass, property } = _decorator;

@ccclass(‘NewComponent’)
export class NewComponent extends Component {
@property({type:Sprite})
sp: Sprite = null;

public whiteBase64src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGUlEQVQYlWP8////fwY8gAmf5DBRwMDAAAAbbgQMbCH2PAAAAABJRU5ErkJggg==';
public createSpriteFrameWithBase64 (url: string, base64Src: string): Promise<SpriteFrame> {
    return new Promise((resolve, reject) => {
        const img = new Image();
        const that = this
        img.onload = function (info) {
            const imageAsset = that.createImageAsset(url, img);
            const spf = that.createSpriteFrameWtihImageAsset(imageAsset);
            resolve(spf);
        };
        img.onerror = () => {
            reject(null);
        };
        img.src = base64Src;
    });
}

public createImageAsset (url: string, img: HTMLImageElement): ImageAsset {
    const imgAsset = new ImageAsset(img);
    imgAsset._uuid = url;
    assetManager.assets.add(imgAsset._uuid, imgAsset);
    imgAsset._nativeUrl = imgAsset._uuid;
    assetManager.dependUtil._depends.add(imgAsset._uuid, { deps: [], nativeDep: [] });

    return imgAsset;
}
public createTexture2DWtihImageAsset (imgAsset: ImageAsset): Texture2D {
    const texture = new Texture2D();
    texture.image = imgAsset;
    //@ts-ignore
    texture._uuid = "bbbbbb";
    //@ts-ignore
    texture._nativeUrl = '';
    //@ts-ignore
    assetManager.assets.add(texture._uuid, texture);
    assetManager.dependUtil._depends.add(texture._uuid, { deps: [imgAsset._uuid], nativeDep: [] });

    return texture;
}
public createSpriteFrameWtihImageAsset (imgAsset: ImageAsset): SpriteFrame {
    const texture = this.createTexture2DWtihImageAsset(imgAsset);
    const spf = new SpriteFrame();
    spf.texture = texture;
    spf._uuid = "aaaaa";
    spf._nativeUrl = '';
    assetManager.assets.add(spf._uuid, spf);
    assetManager.dependUtil._depends.add(spf._uuid, { deps: [texture._uuid], nativeDep: [] });

    return spf;
}
start() {
    this.createSpriteFrameWithBase64("aaaab",this.whiteBase64src).then(v=>{
        this.sp.spriteFrame = v;
    })
}

update(deltaTime: number) {
    
}

}

android 原生creator3.7测试正常显示

可以,试了下,我说错了,不过能否合图有待测试