const { ccclass } = cc._decorator;
@ccclass
export default class NumScrolling extends cc.Component {
private numLabel: cc.Label = null;
private __num: number = 0;
private arr: Array<number> = [];
private isAnimIng: boolean = false;
private get num() {
return this.__num;
}
private set num(val: number) {
this.__num = val;
if (!this.numLabel) {
this.numLabel = this.node.getComponent(cc.Label);
this.numLabel.cacheMode = cc.Label.CacheMode.CHAR;
}
this.numLabel.string = val.toFixed(0);
}
public to(num: number) {
console.log('NumScrolling to >>>' + num);
this.arr.push(num);
if (!this.isAnimIng) {
this.run();
}
}
private async run() {
const one = this.arr.shift();
this.isAnimIng = Boolean(one);
if (one) {
await this.anim(one);
this.run();
}
}
private async anim(lastNum: number): Promise<void> {
return new Promise(async (resolve) => {
const c = Math.abs(lastNum - this.num);
if (c != 0) {
let step = c / 20;
let dir = lastNum > this.num ? step : -step;
this.schedule(() => {
this.num += dir;
console.log(this.num, dir);
if ((dir > 0 && this.num > lastNum) || (dir < 0 && this.num < lastNum)) {
this.num = lastNum;
this.unscheduleAllCallbacks();
resolve();
return;
}
}, 0.001);
} else {
resolve();
}
});
}
}
直接挂在带label的node上,
调用to方法即可