UEMergeTip.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import GameDataCenter from "../../data/GameDataCenter";
  2. import UEBase from "../../frameWork/compment/UEBase";
  3. import EventMng from "../../manager/EventMng";
  4. import { uiCommon } from "../../utils/UICommon";
  5. import { GridEvent } from "./GridEvent";
  6. import UECube from "./UECube";
  7. import UEMergeTipItem from "./UEMergeTipItem";
  8. const { ccclass, property } = cc._decorator;
  9. export interface I_MergeTipData {
  10. idx: number;
  11. ueCube1: UECube;
  12. ueCube2: UECube;
  13. dir: number;//1左,2右
  14. }
  15. @ccclass
  16. export default class UEMergeTip extends UEBase {
  17. static readonly BundleKey: string = "gridMap";
  18. static readonly PrefabUrl: string = "UEMergeTip";
  19. static readonly CLS: string = "UEMergeTip";
  20. @property(cc.Prefab)
  21. prefab_item: cc.Prefab = null!;
  22. @property(cc.Node)
  23. node_content: cc.Node = null!;
  24. @property(cc.Node)
  25. bg: cc.Node = null!;
  26. data: I_MergeTipData = null!;
  27. lastAdsorbCube: UECube = null;
  28. Init(data: I_MergeTipData) {
  29. //检测是否重复位置和重复合成链
  30. // this.node.active = true;
  31. // EventMng.emit(GridEvent.HC_MERGE_TIP, true);
  32. // if (this.data && data.idx == this.data.idx) {
  33. // return;
  34. // }
  35. this.data = data;
  36. let mergeArr = GameDataCenter.gridMap.GetMergeItems(data.ueCube1, data.ueCube2);
  37. if (mergeArr.length > 0) {
  38. this.node.active = true;
  39. for (let i = 1; i <= 4; i++) {
  40. let itemNode = this.node_content.children[i - 1];
  41. if (!itemNode) {
  42. itemNode = cc.instantiate(this.prefab_item);
  43. this.node_content.addChild(itemNode);
  44. }
  45. let pos = this.GetCirclePosition(i - 1, mergeArr.length);
  46. itemNode.setPosition(pos);
  47. itemNode.getComponent(UEMergeTipItem).Init({ data: mergeArr[i - 1] });
  48. }
  49. EventMng.emit(GridEvent.HC_MERGE_TIP, { isShow: true, mergeArr: mergeArr });
  50. if (this.data.dir == 2) {
  51. //补充旋转角度
  52. this.bg.angle = 25;
  53. } else {
  54. this.bg.angle = -25;
  55. }
  56. let angle = uiCommon.GetTwoPointAngle(data.ueCube2.node.position, data.ueCube1.node.position);
  57. this.data.ueCube2.Adsorb(angle);
  58. this.lastAdsorbCube = this.data.ueCube2;
  59. } else {
  60. this.node.active = false;
  61. EventMng.emit(GridEvent.HC_MERGE_TIP, { isShow: false });
  62. }
  63. }
  64. Hide() {
  65. this.node.active = false;
  66. EventMng.emit(GridEvent.HC_MERGE_TIP, { isShow: false });
  67. if (this.lastAdsorbCube) {
  68. this.lastAdsorbCube.CancelAdsorb();
  69. this.lastAdsorbCube = null;
  70. }
  71. }
  72. /** 计算圆上的位置 */
  73. private GetCirclePosition(index: number, total: number): cc.Vec2 {
  74. const radius = 120; // 圆的半径
  75. if (total === 1) {
  76. // 只有一个元素时,放在正上方
  77. return cc.v2(0, radius);
  78. }
  79. // 计算每个元素之间的角度
  80. const angleStep = 60; // 相邻两个元素之间的角度
  81. const startAngle = (this.data.dir == 1 ? 60 : 120) + -total * angleStep / 2 + angleStep / 2; // 从90度(正上方)开始,向右分布
  82. // 计算当前元素的角度(角度转弧度)
  83. const angle = (startAngle + index * angleStep) * Math.PI / 180; // 减去角度使其向右分布
  84. // 计算圆上的位置
  85. const x = radius * Math.cos(angle);
  86. const y = radius * Math.sin(angle);
  87. return cc.v2(x, y);
  88. }
  89. }