HomeUI.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { _decorator, Component, Label, Node } from 'cc';
  2. import { UserManager } from './Manager/UserMgr';
  3. import { GameUtil } from './GameUtil';
  4. import { tgxUIMgr } from '../../core_tgx/tgx';
  5. import { UI_BattleGambit } from '../../scripts/UIDef';
  6. import { EventDispatcher } from '../../core_tgx/easy_ui_framework/EventDispatcher';
  7. import { GameEvent } from './Enum/GameEvent';
  8. const { ccclass, property } = _decorator;
  9. @ccclass('HomeUI')
  10. export class HomeUI extends Component {
  11. @property(Label)
  12. public lbPower: Label = null;
  13. @property(Label)
  14. public lbTimeCount: Label = null; // 倒计时组件
  15. //体力恢复时间
  16. private powerRecoverTime: number = 1;
  17. //体力最大值
  18. private powerMax: number = 1;
  19. //当前体力
  20. private powerCurrent: number = 0;
  21. //剩余恢复时间
  22. private remainingTime: number = 0;
  23. protected onLoad(): void {
  24. this.registerListener();
  25. }
  26. protected onDestroy(): void {
  27. this.unregisterListener();
  28. }
  29. start() {
  30. const {powerRecoverTime,powerMax,powerCurrent} = UserManager.instance.userModel;
  31. this.powerRecoverTime = powerRecoverTime;
  32. this.powerMax = powerMax;
  33. this.powerCurrent = powerCurrent;
  34. const lastLeave = localStorage.getItem("lastLeaveTime");
  35. if (lastLeave) {
  36. const lastTime = parseInt(lastLeave);
  37. const now = Date.now();
  38. const offlineSeconds = Math.floor((now - lastTime) / 1000);
  39. // 计算可以恢复的体力数量
  40. const recoverCount = Math.floor(offlineSeconds / this.powerRecoverTime);
  41. this.powerCurrent = Math.min(this.powerCurrent + recoverCount, this.powerMax);
  42. // 计算剩余恢复时间
  43. if (this.powerCurrent < this.powerMax) {
  44. this.remainingTime = this.powerRecoverTime - (offlineSeconds % this.powerRecoverTime);
  45. } else {
  46. this.remainingTime = 0;
  47. }
  48. console.log(`离线恢复: ${recoverCount}点体力, 当前体力: ${this.powerCurrent}/${this.powerMax}`);
  49. } else {
  50. this.remainingTime = this.powerRecoverTime;
  51. }
  52. // 保存当前时间为新的退出时间
  53. localStorage.setItem("lastLeaveTime", Date.now().toString());
  54. this.updatePowerUI();
  55. }
  56. private registerListener() {
  57. EventDispatcher.instance.on(GameEvent.EVENT_REFRESH_PLAYER_INFO,this.updatePowerUI,this);
  58. }
  59. update(deltaTime: number) {
  60. if(!this.lbTimeCount || !this.lbPower) return;
  61. if (this.powerCurrent >= this.powerMax) {
  62. this.lbTimeCount.string = 'Max';
  63. return;
  64. }
  65. this.remainingTime -= deltaTime;
  66. if (this.remainingTime <= 0) {
  67. this.powerCurrent = Math.min(this.powerCurrent + 1, this.powerMax);
  68. this.remainingTime = this.powerRecoverTime;
  69. this.updatePowerUI();
  70. }
  71. this.lbTimeCount.string = GameUtil.formatToTimeString(Math.ceil(this.remainingTime));
  72. }
  73. private updatePowerUI() {
  74. if(!this.lbPower) return;
  75. this.lbPower.string = this.powerCurrent.toString();
  76. if (this.powerCurrent >= this.powerMax) {
  77. this.lbTimeCount.string = 'Max';
  78. }
  79. }
  80. private unregisterListener() {
  81. EventDispatcher.instance.off(GameEvent.EVENT_REFRESH_PLAYER_INFO,this.updatePowerUI,this);
  82. }
  83. }