3.6.1 color.lerp用法有BUG

是不是lerp有BUG呀?我这样写始终到不了目标颜色 255,255,255

227 227 227 调用了652次 一直没有上涨

断点发现进去数据变化了


第二次又复原了

如何弄呀?

Color取整了,这样呢?


@ccclass('MainScene')
export default class MainScene extends Component {
    protected start(): void {
        const startTime = Date.now();
        this.changeColor(new Color(227, 227, 227), new Color(255, 255, 255), 2500).then(() => console.log(`Change color use ${Date.now() - startTime}ms`))
    }

    private changeColor(color: Color, to: Color, durationMs: number): Promise<void> {
        const promise: Promise<void> = new Promise(resolve => {
            const startTime = Date.now();
            const update = (_dt: number): void => {
                const updateTime = Date.now() - startTime;
                const updateColor = color.lerp(to, updateTime / durationMs);
                color.set(updateColor);
                console.log(`{r: ${color.r}, g:${color.g}, b:${color.b}}`);
                if (updateTime >= durationMs) {
                    this.unschedule(update);
                    resolve();
                }
            }
            this.schedule(update, 0);
        });
        return promise;
    }
}

用tween更好

用过tween,从0,0,0到255,255,255的变化不是递增的,看上去像是胡乱变化,明儿我试试

颜色值计算完就被取整了。可以用Vec4来替代计算。
像2dx颜色有Color4B和Color4F的区分,这种情况就可以用Color4F。

lerp 第二个参数是应该是一个 0-1 的值,dt 不合适吧

1赞

+10086

dt难道不是在0~1之间吗 :nerd_face: :nerd_face: :nerd_face: :nerd_face: :nerd_face: :nerd_face:

但是 60 帧, dt 永远都是一个 1/60 左右的值,它到不了 1

要到1的话,就只能是dt的值为1了,其他小于1的值其实都是永远到不了吧 :joy: :joy: :joy:

像楼主,应该每帧把 dt 相加,用相加后的值去做 lerp 的第二个参数,可能就是他想要的效果了

每帧dt相加,插值得出的值变化也大,但是好歹最后能够达到目标颜色,就你了!阿发!

你嫌变化值大,可以给 相加后的值再乘一个系数,比如 0.5 , 就可以慢一倍了

已经做处理了 :joy: