123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- import GameDataCenter from "../../data/GameDataCenter";
- import FguiLoadMgr from "../fgui/FguiLoadMgr";
- const { ccclass, disallowMultiple } = cc._decorator;
- /**
- * rolllabel
- */
- @ccclass
- @disallowMultiple
- export default class RollLabel extends cc.Component {
- private targetVal: number = null;
- private startVal: number = null;
- private cb: Function = null;
- private curVal: number = null;
- private isChange: boolean = false;
- //目标和起始值的差值
- private min: number;
- //管理文本对象
- obj: fairygui.GLabel | fairygui.GTextField | fairygui.GRichTextField = null;
- private upArrCom: fairygui.GComponent;
- private upEff: cc.Tween;
- private arr: fairygui.GComponent;
- changeTime: number;
- readonly defaulChangeTime = 0.5;
- readonly defaulOffsetX = 0.5;
- readonly defaulOffsetY = 0;
- endCb: Function;
- //累计时间
- private curTime: number = 0;
- setData(targetVal: number, cb: (curval: number) => void = null, param: RollLabelParam = null) {
- this.endCb = param.endCb;
- this.changeTime = param?.changeTime ? param.changeTime : this.defaulChangeTime;
- if (cb) this.cb = cb.bind(param?.target);
- if (param?.oldval) {
- this.initLabel(param.oldval);
- }
- if (this.targetVal != null) {
- if (this.targetVal == targetVal) return;
- this.StartRollNum(targetVal);
- if (param?.needArr) {
- if (this.upArrCom == null) {
- this.upArrCom = fgui.UIPackage.createObject("Common", "RollLabelEff") as fairygui.GComponent;
- this.obj.node.addChild(this.upArrCom.node);
- this.arr = this.upArrCom.getChild("arr") as fairygui.GComponent;
- // let leftupx = -this.obj.node.anchorX * this.obj.node.width;
- // let offsetx = param?.arrOffsetX != null ? param.arrOffsetX : this.defaulOffsetX;
- // let posx = leftupx + offsetx * this.obj.node.width;
- // let leftupy = (1 - this.obj.node.anchorY) * this.obj.node.height;
- // let offsety = param?.arrOffsetY != null ? param.arrOffsetY : this.defaulOffsetY;
- // let posy = leftupy + offsety * this.obj.node.height + this.arr.height / 2;
- let leftupx = 0;
- let offsetx = param?.arrOffsetX != null ? param.arrOffsetX : this.defaulOffsetX;
- let posx = leftupx + offsetx * this.obj.width;
- let leftupy = 0;
- let offsety = param?.arrOffsetY != null ? param.arrOffsetY : this.defaulOffsetY;
- let posy = leftupy - offsety * this.arr.height;
- this.upArrCom.x = posx;
- this.upArrCom.y = posy;
- this.upArrCom.touchable = false;
- }
- this.StartEff();
- }
- } else {
- this.initLabel(targetVal);
- }
- }
- initLabel(val) {
- this.targetVal = val;
- this.curVal = val;
- this.ChangeLabel(val);
- }
- ChangeLabel(num: number) {
- if (this.cb) {
- this.cb(num);
- } else {
- FguiLoadMgr.setLabel(this.obj, num?.toString());
- }
- }
- StartEff() {
- if (this.upEff) this.upEff.stop();
- this.upArrCom.visible = true;
- this.arr.y = 0;
- this.arr.alpha = 0;
- this.upEff = cc
- .tween(this.arr)
- .to(0.15, {
- alpha: 1,
- })
- .delay(0.2)
- .to(0.15, {
- alpha: 0,
- y: -16,
- })
- .call(() => {
- this.upArrCom.visible = false;
- })
- .start();
- }
- StartRollNum(num) {
- if (this.isChange) {
- this.curVal = this.targetVal;
- this.startVal = this.curVal;
- this.SetChangeState(num);
- } else {
- this.startVal = this.curVal;
- this.SetChangeState(num);
- }
- }
- SetChangeState(targetVal: number) {
- this.targetVal = targetVal;
- this.min = this.targetVal - this.startVal;
- this.curTime = 0;
- this.isChange = true;
- }
- protected update(dt: number): void {
- if (this.isChange) {
- this.curTime += dt;
- if (this.curTime > this.changeTime) this.curTime = this.changeTime;
- let persent = this.curTime / this.changeTime;
- this.curVal = Math.floor(persent * this.min + this.startVal);
- if (this.curVal == this.targetVal || this.curTime >= this.changeTime) {
- this.curVal = this.targetVal;
- this.isChange = false;
- if (this.endCb) this.endCb();
- }
- this.ChangeLabel(this.curVal);
- }
- }
- protected onDisable(): void {
- this.clearState();
- }
- private clearState() {
- if (this.upArrCom) this.upArrCom.visible = false;
- this.isChange = false;
- this.targetVal = null;
- this.curVal = null;
- this.startVal = null;
- this.min = 0;
- this.curTime = 0;
- }
- }
- export class RollLabelParam {
- /**
- * cb需要绑定的bind(target)
- */
- target?: any;
- /**
- * 是否需要箭头特效
- */
- needArr?: boolean;
- /**
- * 箭头特效向右偏移百分比,默认0.5(以文本宽度为100%
- */
- arrOffsetX?: number;
- /**
- * 箭头特效向上偏移百分比,默认0.5(以箭头高度为100%
- */
- arrOffsetY?: number;
- /**
- * 是否需要一开始就改变数字
- */
- oldval?: number;
- /**
- * 改变时间
- */
- changeTime?: number;
- /**
- * 完成时的回调
- */
- endCb?: Function;
- }
|