UEMergeTip.ts 3.0 KB

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