SmallShelve.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import { _decorator, Component, instantiate, Label, macro, Node, Prefab, ProgressBar, v3, Vec3 } from 'cc';
  2. import { Bundle } from '../enum/Bundle';
  3. import { ResMgr } from '../manager/ResMgr';
  4. import { Goods } from './Goods';
  5. import { GameMgr } from '../manager/GameMgr';
  6. import { ShelveBase } from '../scriptBase/ShelveBase';
  7. import { Global } from '../Global';
  8. const { ccclass, property } = _decorator;
  9. @ccclass('Game/SmallShelve')
  10. export class SmallShelve extends ShelveBase {
  11. @property(ProgressBar)
  12. private progressBar: ProgressBar = null
  13. @property([Node])
  14. private layers: Node[] = []
  15. public get isEmpty(): boolean {
  16. for (let i = 0; i < this.layers.length; i++) {
  17. const layer: Node = this.layers[i];
  18. if (layer.children.length > 0) return false
  19. }
  20. return true
  21. }
  22. //layer goodsId
  23. private layerGoodsMap: Map<number, number> = new Map<number, number>()
  24. protected onLoad(): void {
  25. super.onLoad()
  26. GameMgr.shelveArr.push(this)
  27. globalThis.smallShelve = this
  28. }
  29. protected start(): void {
  30. super.start()
  31. this.init()
  32. this.schedule(this.onTrySupplyGoods, 0.25, macro.REPEAT_FOREVER)
  33. }
  34. public init(bounceDelay: number = 0): void {
  35. this.createLayerGoods(0, bounceDelay)
  36. this.createLayerGoods(1, bounceDelay)
  37. this.createLayerGoods(2, bounceDelay)
  38. }
  39. protected onTrySupplyGoods(): void {
  40. for (let i = 0; i < 3; i++) {
  41. const layerGoods: Goods = this.layers[i].getComponentInChildren(Goods)
  42. if (layerGoods) continue
  43. if (i === 2) continue
  44. const nextLayer: number = i + 1
  45. const nextLayerGoods: Goods = this.layers[nextLayer].getComponentInChildren(Goods)
  46. if (!nextLayerGoods) continue
  47. const nextLayerGoodsPos: Vec3 = nextLayerGoods.node.getPosition()
  48. nextLayerGoods.Layer = i
  49. nextLayerGoods.node.setParent(this.layers[i])
  50. nextLayerGoodsPos.y -= Global.Goods_Offset
  51. nextLayerGoods.node.setPosition(nextLayerGoodsPos)
  52. this.layerGoodsMap.delete(nextLayer)
  53. this.layerGoodsMap.set(i, nextLayerGoods.Id)
  54. nextLayerGoods.bounce()
  55. }
  56. this.progressBar.progress = this.layerGoodsMap.size / 3
  57. }
  58. public createGoods(goodsId: number, slotId: number, layer: number): Goods {
  59. const goodsPre: Prefab = ResMgr.getRes(Bundle.Game, 'Goods')
  60. const goodsNode: Node = instantiate(goodsPre)
  61. const goods: Goods = goodsNode.getComponent(Goods)
  62. const layerNode: Node = this.layers[layer]
  63. const pos: Vec3 = v3()
  64. pos.y = layer * Global.Goods_Offset - 10
  65. layerNode.addChild(goodsNode)
  66. goodsNode.setPosition(pos)
  67. goods.Id = goodsId
  68. goods.Layer = layer
  69. goods.Slot = slotId
  70. this.layerGoodsMap.set(layer, goodsId)
  71. return goods
  72. }
  73. public createLayerGoods(layer: number, bounceDelay: number = 0): void {
  74. const shelveData = GameMgr.goodsData[this.id]
  75. for (const slot in shelveData) {
  76. if (Object.prototype.hasOwnProperty.call(shelveData, slot)) {
  77. const goodsArr: number[] = shelveData[slot]
  78. if (goodsArr.length <= 0) continue
  79. const goodsId: number = goodsArr.shift()
  80. if (goodsId === -1) continue
  81. const goods: Goods = this.createGoods(goodsId, Number(slot), layer)
  82. goods.bounce(bounceDelay)
  83. }
  84. }
  85. }
  86. public placeGoods(goodsId: number, slotId: number): void {
  87. this.layerGoodsMap.clear()
  88. const layerGoodsArr: Goods[] = []
  89. for (let i = 0; i < 2; i++) {
  90. const layer: Node = this.layers[i]
  91. const layerGoods: Goods = layer.getComponentInChildren(Goods)
  92. if (!layerGoods) break
  93. layerGoodsArr.push(layerGoods)
  94. }
  95. for (let i = 0; i < layerGoodsArr.length; i++) {
  96. const layerGoods: Goods = layerGoodsArr[i]
  97. const layerGoodsPos: Vec3 = layerGoods.node.getPosition()
  98. const nextlayer: number = i + 1
  99. layerGoods.Layer = nextlayer
  100. layerGoods.node.setParent(this.layers[nextlayer])
  101. layerGoodsPos.y += Global.Goods_Offset
  102. layerGoods.node.setPosition(layerGoodsPos)
  103. this.layerGoodsMap.set(nextlayer, layerGoods.Id)
  104. }
  105. const goods: Goods = this.createGoods(goodsId, 0, 0)
  106. goods.bounce()
  107. }
  108. protected onPlaceGoods(): void {
  109. const layer0: Node = this.layers[0]
  110. const layer0Goods: Goods = layer0.getComponentInChildren(Goods)
  111. if (!layer0Goods || layer0Goods.Visible) return
  112. layer0Goods.node.destroy()
  113. this.layerGoodsMap.delete(0)
  114. }
  115. public isSlotOccupied(slot?: number): boolean {
  116. const layer0Goods: Goods = this.layers[0].getComponentInChildren(Goods)
  117. if (layer0Goods && layer0Goods.Visible === false) return true
  118. return this.layerGoodsMap.size >= 3
  119. }
  120. public isAllSlotOccupied(): boolean {
  121. return this.layerGoodsMap.size === 3
  122. }
  123. public getSlot(pos: Vec3): number {
  124. return 0
  125. }
  126. public get GoodsIdArr(): number[] {
  127. const goodsIdArr: number[] = []
  128. for (let i = 0; i < this.layers.length; i++) {
  129. const layer: Node = this.layers[i];
  130. const layerGoodsArr: Goods[] = layer.getComponentsInChildren(Goods)
  131. for (let j = 0; j < layerGoodsArr.length; j++) {
  132. const goods: Goods = layerGoodsArr[j];
  133. goodsIdArr.push(goods.Id)
  134. }
  135. }
  136. return goodsIdArr
  137. }
  138. public get GoodsInfo(): Object {
  139. const info = {}
  140. for (let i = 0; i < this.layers.length; i++) {
  141. const layer: Node = this.layers[i];
  142. if (!info.hasOwnProperty(i)) {
  143. info[i] = {}
  144. }
  145. const layerGoodsArr: Goods[] = layer.getComponentsInChildren(Goods)
  146. for (let j = 0; j < layerGoodsArr.length; j++) {
  147. const goods: Goods = layerGoodsArr[j];
  148. const { Slot, Id } = goods
  149. info[i][Slot] = goods
  150. }
  151. }
  152. return info
  153. }
  154. public clear(): void {
  155. this.layerGoodsMap.clear()
  156. for (let i = 0; i < this.layers.length; i++) {
  157. const layer: Node = this.layers[i];
  158. layer.destroyAllChildren()
  159. }
  160. }
  161. public removeGoods(goods: Goods): void {
  162. this.layerGoodsMap.delete(goods.Layer)
  163. goods.remove()
  164. }
  165. }