ContainerView.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import { _decorator, CCInteger, color, Color, Component, EventTouch, Graphics, instantiate, Label, Mask, Node, PolygonCollider2D, Prefab, sp, Sprite, SpriteAtlas, SpriteFrame, tween, UITransform, Vec2, Vec3 } from 'cc';
  2. import { Container, KnittPathGroup } from './Container';
  3. const { ccclass, property } = _decorator;
  4. @ccclass('ContainerView')
  5. export class ContainerView extends Component {
  6. container: Container
  7. @property(Prefab)
  8. Knitt: Prefab = null
  9. @property(Prefab)
  10. KnittLink: Prefab = null
  11. @property(Node)
  12. KnittFlow: Node = null;
  13. @property([SpriteFrame])
  14. emptyCell: SpriteFrame[]= [];
  15. private cellNodes: Node[][] = [];
  16. private touchCallbacks: {
  17. onTouchStart?: (cellIndex: number, groupIndex: number, event: EventTouch) => void;
  18. onTouchMove?: (cellIndex: number, groupIndex: number, event: EventTouch) => void;
  19. onTouchEnd?: (cellIndex: number, groupIndex: number, event: EventTouch) => void;
  20. } = {};
  21. init(container: Container) {
  22. this.container = container
  23. container.view = this.node
  24. }
  25. setemptyCell(emptyCell: SpriteFrame[]) {
  26. this.emptyCell = emptyCell;
  27. }
  28. setTouchCallbacks(
  29. onTouchStart: (cellIndex: number, groupIndex: number, event: EventTouch) => void,
  30. onTouchMove: (cellIndex: number, groupIndex: number, event: EventTouch) => void,
  31. onTouchEnd: (cellIndex: number, groupIndex: number, event: EventTouch) => void
  32. ) {
  33. this.touchCallbacks = { onTouchStart, onTouchMove, onTouchEnd };
  34. }
  35. setupKnittPaths(cellNodes: Node[][], boardCols: number, boardRows: number) {
  36. this.cellNodes = cellNodes;
  37. if (!this.Knitt) {
  38. console.warn('Knitt预制体未设置');
  39. return;
  40. }
  41. this.container.pathGroups.forEach((pathGroup) => {
  42. const { path, groupIndex } = pathGroup;
  43. if (path.length >= 2) {
  44. const startIndex = path[0];
  45. const endIndex = path[path.length - 1];
  46. this.createKnittAtCell(startIndex, groupIndex, boardCols, boardRows);
  47. this.createKnittAtCell(endIndex, groupIndex, boardCols, boardRows);
  48. }
  49. });
  50. }
  51. // 创建Knitt(修改后的版本)
  52. private createKnittAtCell(cellIndex: number, groupIndex: number, boardCols: number, boardRows: number) {
  53. const { row, col } = this.getRowColFromIndex(cellIndex, boardCols);
  54. if (row >= 0 && row < boardRows && col >= 0 && col < boardCols) {
  55. const cellNode = this.cellNodes[row][col];
  56. if (cellNode && this.KnittFlow) { // 确保KnittFlow存在
  57. const knittNode = instantiate(this.Knitt);
  58. // 将Knitt节点设置为KnittFlow的子节点
  59. knittNode.setParent(this.KnittFlow);
  60. // 获取格子节点的世界坐标
  61. const worldPos = cellNode.worldPosition;
  62. // 将世界坐标转换为KnittFlow节点的本地坐标
  63. const localPos = new Vec3();
  64. this.KnittFlow.inverseTransformPoint(localPos, worldPos);
  65. knittNode.setPosition(localPos);
  66. this.setupKnittProperties(knittNode, groupIndex);
  67. // 绑定触摸事件
  68. this.setupKnittTouchEvents(knittNode, cellIndex, groupIndex);
  69. }
  70. }
  71. }
  72. // 设置Knitt触摸事件
  73. private setupKnittTouchEvents(knittNode: Node, cellIndex: number, groupIndex: number) {
  74. knittNode.on(Node.EventType.TOUCH_START, (event: EventTouch) => {
  75. this.playSelectAnimation(knittNode);
  76. if (this.touchCallbacks.onTouchStart) {
  77. this.touchCallbacks.onTouchStart(cellIndex, groupIndex, event);
  78. }
  79. });
  80. knittNode.on(Node.EventType.TOUCH_MOVE, (event: EventTouch) => {
  81. if (this.touchCallbacks.onTouchMove) {
  82. this.touchCallbacks.onTouchMove(cellIndex, groupIndex, event);
  83. }
  84. });
  85. knittNode.on(Node.EventType.TOUCH_END, (event: EventTouch) => {
  86. if (this.touchCallbacks.onTouchEnd) {
  87. this.touchCallbacks.onTouchEnd(cellIndex, groupIndex, event);
  88. }
  89. });
  90. knittNode.on(Node.EventType.TOUCH_CANCEL, (event: EventTouch) => {
  91. if (this.touchCallbacks.onTouchEnd) {
  92. this.touchCallbacks.onTouchEnd(cellIndex, groupIndex, event);
  93. }
  94. });
  95. }
  96. // 根据索引获取行列坐标
  97. getRowColFromIndex(index: number, boardCols: number): { row: number, col: number } {
  98. const row = Math.floor(index / boardCols);
  99. const col = index % boardCols;
  100. return { row, col };
  101. }
  102. // 设置Knitt的属性
  103. private setupKnittProperties(knittNode: Node, groupIndex: number) {
  104. const colorIndex = groupIndex % this.emptyCell.length;
  105. const emsp = this.emptyCell[colorIndex];
  106. const sprite = knittNode.getComponent(Sprite);
  107. if (sprite) {
  108. sprite.spriteFrame = emsp;
  109. }
  110. }
  111. // 播放选择动画
  112. playSelectAnimation(node: Node) {
  113. if (node) {
  114. tween(node)
  115. .to(0.1, { scale: new Vec3(1.2, 1.2, 1.2) })
  116. .to(0.1, { scale: new Vec3(1, 1, 1) })
  117. .start();
  118. }
  119. }
  120. }