CoinDrop.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import { _decorator, Component, Vec3, tween, find, Label } from 'cc';
  2. import { LevelSessionManager } from '../Core/LevelSessionManager';
  3. const { ccclass } = _decorator;
  4. @ccclass('CoinDrop')
  5. export class CoinDrop extends Component {
  6. private targetWorldPos: Vec3 = new Vec3();
  7. onEnable() {
  8. // 找到 UI 里金币图标的世界坐标
  9. const icon = find('Canvas/GameLevelUI/CoinNode/CoinDrop');
  10. if (!icon) { this.node.destroy(); return; }
  11. icon.getWorldPosition(this.targetWorldPos);
  12. // 初始弹跳向上 80px(0.3s)→ 落下 40px(0.2s)→ 飞向目标 (0.4s)
  13. const start = this.node.worldPosition.clone();
  14. const bounceUp = start.clone(); bounceUp.y += 80;
  15. const settle = bounceUp.clone(); settle.y -= 40;
  16. tween(this.node)
  17. .to(0.3, { worldPosition: bounceUp }, { easing: 'quadOut' })
  18. .to(0.2, { worldPosition: settle }, { easing: 'quadIn' })
  19. .to(0.4, { worldPosition: this.targetWorldPos }, { easing: 'quadIn' })
  20. .call(() => {
  21. // 飞到图标后 +1 并销毁
  22. const lblNode = find('Canvas/GameLevelUI/CoinNode/CoinLabel');
  23. const lbl = lblNode?.getComponent(Label);
  24. if (lbl) {
  25. lbl.string = (parseInt(lbl.string) + 1).toString();
  26. }
  27. LevelSessionManager.inst.addCoins(1); // 记账(局内金币)
  28. this.node.destroy();
  29. })
  30. .start();
  31. }
  32. }