UEMergeTip.ts 3.1 KB

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