UEMergeTip.ts 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 AssetMgr from "../../utils/AssetMgr";
  7. import UECube, { E_CubeType } from "./UECube";
  8. const { ccclass, property } = cc._decorator;
  9. export interface I_MergeTipData {
  10. idx: number;
  11. ueCube1: UECube;
  12. ueCube2: UECube;
  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. data: I_MergeTipData = null!;
  20. Init(data: I_MergeTipData) {
  21. //检测是否重复位置和重复合成链
  22. if (this.data && data.idx == this.data.idx) {
  23. return;
  24. }
  25. this.data = data;
  26. let mergeArr = GameDataCenter.gridMap.GetMergeItems(data.ueCube1, data.ueCube2);
  27. if (mergeArr.length > 0) {
  28. this.node.active = true;
  29. for (let i = 1; i <= 4; i++) {
  30. let itemNode = this.node.children[i - 1];
  31. let pos = this.GetCirclePosition(i - 1, mergeArr.length);
  32. itemNode.setPosition(pos);
  33. this.ShowItem(itemNode, mergeArr[i - 1]);
  34. }
  35. } else {
  36. this.node.active = false;
  37. }
  38. }
  39. private ShowItem(node: cc.Node, data: MergeItem) {
  40. let sp_icon = node.getChildByName("sp_icon").getComponent(ResSprite);
  41. let node_lock = node.getChildByName("node_lock");
  42. if (data) {
  43. node.active = true;
  44. node_lock.active = false;
  45. if (data.type == E_CubeType.Emitter) {
  46. let mergePropCfg = Gamecfg.emitterInfo.getItem(data.id.toString());
  47. sp_icon.setSpriteFrame('gridMap', `mergeProp/${mergePropCfg.icon}`);
  48. } else if (data.type == E_CubeType.Material) {
  49. let mergePropCfg = Gamecfg.mergePropInfo.getItem(data.id.toString());
  50. sp_icon.setSpriteFrame('gridMap', `mergeProp/${mergePropCfg.icon}`);
  51. } else if (data.type == E_CubeType.MergeEquip) {
  52. let mergePropCfg = Gamecfg.equipInfo.getItem(data.id.toString());
  53. sp_icon.setSpriteFrame('gridMap', `mergeEquip/${mergePropCfg.icon}`);
  54. }
  55. } else {
  56. node.active = false;
  57. }
  58. }
  59. /** 计算圆上的位置 */
  60. private GetCirclePosition(index: number, total: number): cc.Vec2 {
  61. const radius = 100; // 圆的半径
  62. if (total === 1) {
  63. // 只有一个元素时,放在正上方
  64. return cc.v2(0, radius);
  65. }
  66. // 计算每个元素之间的角度
  67. const angleStep = 60; // 相邻两个元素之间的角度
  68. const startAngle = 90 + -total * angleStep / 2 + angleStep / 2; // 从90度(正上方)开始,向右分布
  69. // 计算当前元素的角度(角度转弧度)
  70. const angle = (startAngle + index * angleStep) * Math.PI / 180; // 减去角度使其向右分布
  71. // 计算圆上的位置
  72. const x = radius * Math.cos(angle);
  73. const y = radius * Math.sin(angle);
  74. return cc.v2(x, y);
  75. }
  76. }