3.0怎么用代码创建一个纯色精灵啊?

以前2.4可以通过下面的代码来创建一个纯色贴图
let texture = new cc.RenderTexture();
texture.initWithData(new Uint8Array([0, 0, 0]), cc.Texture2D.PixelFormat.RGB888, 1, 1);
现在3.0 RenderTexture没有initWithData这个方法了,API里也没有找到相关的设置方法,现在完全是一脸懵逼了,也没找到其他接口。求官方大佬指教~

帮你顶上去

其实主要思路是怎么创建一张2*2像素的纯白色图片,有了这个图片设置到Sprite组件的SpriteFrame里就能正确显示Sprite设置的颜色了,具体实现:

var imageObj = new Image();
imageObj.src = “data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACAQMAAABIeJ9nAAAAA1BMVEX///+nxBvIAAAACklEQVQI12MAAgAABAABINItbwAAAABJRU5ErkJggg==”;
var textureObj = new Texture2D();
textureObj.image = new ImageAsset(imageObj);
var sf = new SpriteFrame();
sf.texture = textureObj;

这方法实测可行,但是个人感觉有点偏门,建议官方提供更简单更效率的方法

1赞

我的做法与 @houou 相似,都是利用已经转成 base64 的字符串生成对象。

但是 new Image() 在原生下不可用,因为它是个 DOM 对象。

我的方法是:

const base = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACAQMAAABIeJ9nAAAAA1BMVEX///+nxBvIAAAACklEQVQI12MAAgAABAABINItbwAAAABJRU5ErkJggg==';
cc.assetManager.loadRemote(base, { ext: '.png' }, (err: Error, asset: cc.Texture2D) => {
  if (err) return cc.error(err);
  const sf = new cc.SpriteFrame(asset);
})
3赞

感谢分享,现在好像只能这样了。。。

谢谢分享。。。只能等官方出API才能不这么麻烦了。。。

    try{
        let img = new ImageAsset();
        img.reset({
            _data: new Uint8Array([0,0,0]),
            width: 1,
            height: 1,
            format: Texture2D.PixelFormat.RGBA8888,
            _compressed: false
        });
        let texture = new Texture2D();
        texture.image = img;
        let sf = new SpriteFrame();
        sf.texture = texture;
        sprite.spriteFrame = sf;
    }catch(err){
        console.error('setColorImg error with:',err);
    }

我之前有尝试过这样解决,但是渲染的时候会报错, IMemoryImageSource对象好像有问题

2赞

这个是我之前在v2.4.3版本上使用的,主要是加载了引擎自带贴图,这个你要在3.0试下看是否可行。

 /**设置为默认图 */
    public static WGHEXO_setDefaultSpf(sp: cc.Sprite, cb?: Function, caller?: any) {
        if (!CC_EDITOR) return;
        let url = 'db://internal/image/default_sprite_splash.png/default_sprite_splash';
        Editor.assetdb.queryAssets(url, "sprite-frame", (err, ress) => {
            if (!err) {
                if (ress.length > 0) {
                    cc.loader.load({ uuid: ress[0].uuid }, (err, spf) => {
                        if (!err) {
                            sp.spriteFrame = spf
                            if (cb) {
                                if (caller) cb.bind(caller)
                                cb();
                            }
                        }
                    });
                } else {
                    cc.log("没有资源");
                }
            }
        });
    }
1赞

用不了了,报错,接口都没有了,Editor在3.0是一个BaseEditor,没有assetdb, 我在api里也没找到有获取引擎自带资源的接口。你这个方法是个异步方法,我觉得你如果不更新到3.0可以用我之前的方法,同步方法而且很简单,动态创建了一个1*1的纯色纹理贴图,[0,0,0]可以自行替换0-255的任意数字组成你想要的颜色,或者再自行改节点的颜色也可以。
let texture = new cc.RenderTexture();
texture.initWithData(new Uint8Array([0, 0, 0]), cc.Texture2D.PixelFormat.RGB888, 1, 1);
let sp = new cc.SpriteFrame(texture);
sprite.spriteFrame = sp;

加个sf.packable = false;就可以了,动态合图有问题

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。