123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import { _decorator, Component, Label, math, Node } from 'cc';
- const { ccclass, property } = _decorator;
- /**
- * 调用事例
- * this.combatLable.startCounting(data.total);
- */
- //数字自增长
- @ccclass('NumRaiseLable')
- export class NumRaiseLable extends Label {
- // 动画持续时间(秒)
- @property({ tooltip: '数字增长动画持续时间(秒)' })
- private _duration: number = 0.5;
- @property
- public get duration(): number {
- return this._duration;
- }
- public set duration(value: number) {
- this._duration = math.clamp(value, 0.1, 5);
- }
- // 当前显示的数字
- private _currentValue: number = 0;
- // 目标数字
- private _targetValue: number = 0;
- // 是否正在播放动画
- private _isAnimating: boolean = false;
- // 每帧增量
- private _incrementPerFrame: number = 0;
- /**
- * 开始数字增长动画
- * @param targetValue 目标数值
- * @param duration 可选,动画持续时间(秒),默认使用组件设置的duration
- */
- public startCounting(targetValue: number, duration?: number) {
- if (this._isAnimating) {
- this.stopCounting();
- }
- //使用传入的duration或默认值
- const animDuration = duration ?? this._duration;
- this._targetValue = targetValue;
- this._currentValue = 0;
- this._isAnimating = true;
- //计算每帧增量(假设60FPS)
- this._incrementPerFrame = this._targetValue / (animDuration * 60);
- //取消之前的调度
- this.unschedule(this.updateNumber);
- //开始新的调度
- this.schedule(this.updateNumber, 1/60);
- }
- /**
- * 停止数字增长动画
- */
- public stopCounting() {
- this._isAnimating = false;
- this.unschedule(this.updateNumber);
- this._currentValue = this._targetValue;
- this.updateDisplay();
- }
- /**
- * 立即完成动画
- */
- public completeCounting() {
- this.stopCounting();
- this._currentValue = this._targetValue;
- this.updateDisplay();
- }
- /**
- * 每帧更新数字
- */
- private updateNumber() {
- if (!this._isAnimating) return;
- this._currentValue += this._incrementPerFrame;
- //确保不超过目标值
- if (this._currentValue >= this._targetValue) {
- this._currentValue = this._targetValue;
- this._isAnimating = false;
- this.unschedule(this.updateNumber);
- }
- this.updateDisplay();
- }
- /**
- * 更新显示文本
- */
- private updateDisplay() {
- this.string = Math.floor(this._currentValue).toString();
- }
- //组件销毁时清理
- public onDestroy() {
- this.unschedule(this.updateNumber);
- }
- }
|