IncrementData.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { _decorator, Component, Node } from 'cc';
  2. const { ccclass, property } = _decorator;
  3. interface evt {
  4. valueChange: (nowValue: number) => void
  5. }
  6. export class IncrementData {
  7. // 最大回体力
  8. private maxValue = 0
  9. // 回一点所需体力时间,单位毫秒
  10. private needTime = 5 * 60 * 1000
  11. // 上次恢复体力的时间,0代表当前时间
  12. private lastAddTime: number = 0
  13. // 当前默认值
  14. private _value: number=0
  15. private defValue: number = 0
  16. private _evt = chsdk.get_new_event<evt>();
  17. public get evt() {
  18. return this._evt
  19. }
  20. get value() {
  21. return this._value
  22. }
  23. set value(value: number) {
  24. this._value = value
  25. this.evt.emit("valueChange", value)
  26. }
  27. get needAddTime() {
  28. return this.lastAddTime + this.needTime
  29. }
  30. // 体力是否回满
  31. isMax(): boolean {
  32. if (!this.maxValue) return false
  33. return this.maxValue <= this.value
  34. }
  35. init(needTime: number, defValue: number = 0, maxValue?: number) {
  36. this.needTime = needTime
  37. this.maxValue = maxValue
  38. this.defValue = defValue
  39. }
  40. /**
  41. * 用于自定义,不会累加自带的value也没有最大值
  42. * @param num 当前时间的时间戳,单位到毫秒
  43. * @returns 计算增加值
  44. */
  45. useLastTime(num: number): number {
  46. if (!this.lastAddTime) {
  47. this.lastAddTime = num
  48. return 0
  49. }
  50. if (this.lastAddTime > num) {
  51. this.lastAddTime = num
  52. return 0
  53. }
  54. let difference = num - this.lastAddTime
  55. // 将时间差转化为秒
  56. let addValue = ~~(difference / this.needTime)
  57. if (addValue > 0) {
  58. // 更新lastTime
  59. this.lastAddTime = num - (difference % this.needTime)
  60. return addValue
  61. }
  62. return 0
  63. }
  64. /**
  65. *
  66. * @param time 当前时间的时间戳,单位到毫秒
  67. * @param value 当前结果
  68. * @returns 返回value累加时候的结果
  69. */
  70. addLastTime(time: number) {
  71. if (!this.maxValue) {
  72. return
  73. }
  74. let value = this.value
  75. if (value >= this.maxValue) {
  76. this.lastAddTime = time
  77. return value
  78. }
  79. if (!this.lastAddTime) {
  80. this.lastAddTime = time
  81. return value
  82. }
  83. if (this.lastAddTime > time) {
  84. this.lastAddTime = time
  85. return value
  86. }
  87. let difference = time - this.lastAddTime
  88. // 将时间差转化为秒
  89. let addValue = ~~(difference / this.needTime)
  90. if (addValue > 0) {
  91. // 更新lastTime
  92. let realAdd = Math.min(this.maxValue - value, addValue)
  93. if (realAdd < addValue) {
  94. this.lastAddTime = time - (difference % this.needTime)
  95. } else {
  96. this.lastAddTime = time
  97. }
  98. this.value = value + realAdd
  99. return value + realAdd
  100. }
  101. return value
  102. }
  103. serialize() {
  104. let data = {
  105. lastAddTime: this.lastAddTime,
  106. value:this.value
  107. }
  108. return data
  109. }
  110. unserialize(data: any) {
  111. debugger
  112. if (data) {
  113. this.lastAddTime = data.lastAddTime || 0
  114. this.value = data.value ?? this.defValue
  115. } else {
  116. this.lastAddTime = 0
  117. this.value = this.defValue
  118. }
  119. return this
  120. }
  121. }