OutArea.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { _decorator, Component, Node, tween, Vec3 } from 'cc';
  2. const { ccclass, property, executeInEditMode } = _decorator;
  3. @ccclass('OutArea')
  4. @executeInEditMode
  5. export class OutArea extends Component {
  6. @property(Node)
  7. outNodes: Node = null!;
  8. // 直接使用outNodes的子节点管理
  9. get cups() {
  10. return this.outNodes.children;
  11. }
  12. start() {
  13. }
  14. update(deltaTime: number) {
  15. }
  16. // 修改排列方法为异步
  17. async arrangeCups() {
  18. const startX = 40;
  19. const spacing = 80;
  20. // 过滤掉已销毁的节点
  21. const validCups = this.cups.filter(cup => cup.isValid);
  22. await new Promise<void>(resolve => {
  23. let completed = 0;
  24. validCups.forEach((cup, index) => {
  25. const targetX = startX + index * spacing;
  26. tween(cup)
  27. .to(0.3, { position: new Vec3(targetX, 0, 0) }, { easing: 'sineOut' })
  28. .call(() => {
  29. if (++completed === validCups.length) resolve();
  30. })
  31. .start();
  32. });
  33. // 处理无动画的情况
  34. if (validCups.length === 0) resolve();
  35. });
  36. }
  37. addCup(cup: Node) {
  38. cup.setParent(this.outNodes);
  39. this.arrangeCups();
  40. }
  41. removeCup(cup: Node) {
  42. cup.removeFromParent();
  43. this.arrangeCups();
  44. }
  45. getCups() {
  46. return this.cups;
  47. }
  48. }