吐槽,要如何才能用代码设置九宫格

设置sprite的类型是cc.Sprite.Type.SLICED;后,要如何设置通过代码设置九宫格的分割线????

吐槽1:网上找了半天,一个答案都没有?官方的人都不写代码的吗?

好不容易找到个东西,结果还是错的

let sp = this.packageItem.texture;
sp.insetLeft = 20;//rect.x;
sp.insetTop =  20;//rect.y;
sp.insetRight =  20;//this.packageItem.width-rect.width-rect.x;
sp.insetBottom =  20;//this.packageItem.height-rect.height-rect.y;

this._sprite.type = cc.Sprite.Type.SLICED;

上面的代码的效果如下图,真不知道那四个20像素的边是什么鬼东西!!!

吐槽2:cc.Sprite.Type在creator.d.ts里的定义是Type,且只定义了两个,而真实的代码里是SpriteType,有4个值,你逗我呢???!!!

export module Sprite {		
    /** !#en Enum for sprite type.
    !#zh Sprite 类型 */
    export enum Type {			
        SIMPLE = 0,
        SLICED = 0,		
    }	
}

/**
 * !#en Enum for sprite type.
 * !#zh Sprite 类型
 * @enum Sprite.Type
 */
var SpriteType = cc.Enum({
    /**
     * !#en The simple type.
     * !#zh 普通类型
     * @property {Number} SIMPLE
     */
    SIMPLE: 0,
    /**
     * !#en The sliced type.
     * !#zh 切片(九宫格)类型
     * @property {Number} SLICED
     */
    SLICED: 1,
    /*
     * !#en The tiled type.
     * !#zh 平铺类型
     * @property {Number} TILED
     */
    TILED: 2,
    /*
     * !#en The filled type.
     * !#zh 填充类型
     * @property {Number} FILLED
     */
    FILLED: 3,
    /*
     * !#en The mesh type.
     * !#zh 以 Mesh 三角形组成的类型
     * @property {Number} MESH
     */
    MESH: 4
});


最后是绕了一大圈,看了半天源码才找了一个可以生效的私有函数。。。

sp._refreshTexture(sp._texture);

再次吐槽,2.0把sgNode干掉了,可以说是把原有的大把大把的动能都阉割了。还把好端端的set函数去掉,非要人直接给字段赋值,不知道怎么想的

    provideClearError(cc.Sprite.prototype, {
        setInsetLeft: 'cc.SpriteFrame insetLeft',
        setInsetRight: 'cc.SpriteFrame insetRight',
        setInsetTop: 'cc.SpriteFrame insetTop',
        setInsetBottom: 'cc.SpriteFrame insetBottom',
    });

哈哈,想看官方的筒子们解释一下

最后定位到了_calculateSlicedUV函数。。。

// sp._refreshTexture(sp._texture);
// sp._calculateUV();
sp._calculateSlicedUV();

吐槽一句:调用cc.Sprite的this._sprite.markForUpdateRenderData(true);却不能正确更新九宫格的信息,

却要调用cc.SpriteFrame的sp._calculateSlicedUV();才能生效,怎么看都不合理

这个分割线设计的应该就是在编辑器里编辑吧?

解释一下两个问题

  1. 生成 creator.d.ts 的文档确实有问题。。。低级错误,2.0.2 会修复(实际上就是由真实代码中的 API 文档生成的 .d.ts 文件)
  2. inset 设置后没有更新 UV 的确是有问题的,应该自动调用 _calculateSlicedUV 来更新 UV

在 2.0 中,我们用 SpriteFrame 来保存 UV 数据,是一个很好的数据结构优化,SpriteFrame 作为资源本来就包含了贴图区域、cap inset、mesh 的所有数据,所以完全可以独立计算出 UV。所有使用同样 SpriteFrame 的 Sprite 组件来说,不需要再保存冗余的 UV 数据,只要在数据提交时从 SpriteFrame 获取即可。

所以自然是由 SpriteFrame 作为更新 UV 的主体,而不是 Sprite。

没有发现这个问题的责任在于我们一直用 Editor 来编辑九宫格数据,忽视了代码设置的情况,就不推卸责任了

1赞

panda大佬

我现在这样用发现并没改变九宫格还是和原来变形,版本2.0.9. 是哪里设置参数不对吗?求指点

大佬 为啥我的不行呢?:joy:

因为你没修改精灵的显示状态

要重新显示一下么?还是什么意思

大佬 求指点

低级错误 希望对后面的人有点用

感谢,受用!

请问 1.9.3要怎么用代码设置九宫格。。

好像1.9.3没有 _calculateSlicedUV()这个函数~