SmallShelve.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. goodsNode.setScale(v3(0.6, 0.6, 0.6))
  68. goods.Id = goodsId
  69. goods.Layer = layer
  70. goods.Slot = slotId
  71. this.layerGoodsMap.set(layer, goodsId)
  72. return goods
  73. }
  74. public createLayerGoods(layer: number, bounceDelay: number = 0): void {
  75. const shelveData = GameMgr.goodsData[this.id]
  76. for (const slot in shelveData) {
  77. if (Object.prototype.hasOwnProperty.call(shelveData, slot)) {
  78. const goodsArr: number[] = shelveData[slot]
  79. if (goodsArr.length <= 0) continue
  80. const goodsId: number = goodsArr.shift()
  81. if (goodsId === -1) continue
  82. const goods: Goods = this.createGoods(goodsId, Number(slot), layer)
  83. goods.bounce(bounceDelay)
  84. }
  85. }
  86. }
  87. public placeGoods(goodsId: number, slotId: number): void {
  88. this.layerGoodsMap.clear()
  89. const layerGoodsArr: Goods[] = []
  90. for (let i = 0; i < 2; i++) {
  91. const layer: Node = this.layers[i]
  92. const layerGoods: Goods = layer.getComponentInChildren(Goods)
  93. if (!layerGoods) break
  94. layerGoodsArr.push(layerGoods)
  95. }
  96. for (let i = 0; i < layerGoodsArr.length; i++) {
  97. const layerGoods: Goods = layerGoodsArr[i]
  98. const layerGoodsPos: Vec3 = layerGoods.node.getPosition()
  99. const nextlayer: number = i + 1
  100. layerGoods.Layer = nextlayer
  101. layerGoods.node.setParent(this.layers[nextlayer])
  102. layerGoodsPos.y += Global.Goods_Offset
  103. layerGoods.node.setPosition(layerGoodsPos)
  104. this.layerGoodsMap.set(nextlayer, layerGoods.Id)
  105. }
  106. const goods: Goods = this.createGoods(goodsId, 0, 0)
  107. goods.bounce()
  108. }
  109. protected onPlaceGoods(): void {
  110. const layer0: Node = this.layers[0]
  111. const layer0Goods: Goods = layer0.getComponentInChildren(Goods)
  112. if (!layer0Goods || layer0Goods.Visible) return
  113. layer0Goods.node.destroy()
  114. this.layerGoodsMap.delete(0)
  115. }
  116. public isSlotOccupied(slot?: number): boolean {
  117. const layer0Goods: Goods = this.layers[0].getComponentInChildren(Goods)
  118. if (layer0Goods && layer0Goods.Visible === false) return true
  119. return this.layerGoodsMap.size >= 3
  120. }
  121. public isAllSlotOccupied(): boolean {
  122. return this.layerGoodsMap.size === 3
  123. }
  124. public getSlot(pos: Vec3): number {
  125. return 0
  126. }
  127. public get GoodsIdArr(): number[] {
  128. const goodsIdArr: number[] = []
  129. for (let i = 0; i < this.layers.length; i++) {
  130. const layer: Node = this.layers[i];
  131. const layerGoodsArr: Goods[] = layer.getComponentsInChildren(Goods)
  132. for (let j = 0; j < layerGoodsArr.length; j++) {
  133. const goods: Goods = layerGoodsArr[j];
  134. goodsIdArr.push(goods.Id)
  135. }
  136. }
  137. return goodsIdArr
  138. }
  139. public get GoodsInfo(): Object {
  140. const info = {}
  141. for (let i = 0; i < this.layers.length; i++) {
  142. const layer: Node = this.layers[i];
  143. if (!info.hasOwnProperty(i)) {
  144. info[i] = {}
  145. }
  146. const layerGoodsArr: Goods[] = layer.getComponentsInChildren(Goods)
  147. for (let j = 0; j < layerGoodsArr.length; j++) {
  148. const goods: Goods = layerGoodsArr[j];
  149. const { Slot, Id } = goods
  150. info[i][Slot] = goods
  151. }
  152. }
  153. return info
  154. }
  155. public clear(): void {
  156. this.layerGoodsMap.clear()
  157. for (let i = 0; i < this.layers.length; i++) {
  158. const layer: Node = this.layers[i];
  159. layer.destroyAllChildren()
  160. }
  161. }
  162. public removeGoods(goods: Goods): void {
  163. this.layerGoodsMap.delete(goods.Layer)
  164. goods.remove()
  165. }
  166. }