LeaderSkill.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { _decorator, Component, Node, Prefab, instantiate, v3, tween, Widget } from 'cc';
  2. import { DataSystem } from '../core/data/DataSystem';
  3. import { GM } from '../launch/GM';
  4. import { BattleData } from './BattleData';
  5. import { LeaderSkillNode } from './LeaderSkillNode';
  6. import { LeaderSkillShow } from './LeaderSkillShow';
  7. import { Monster } from './Monster';
  8. import { TakeAWalk, WalkDirection } from './TakeAWalk';
  9. const { ccclass, property } = _decorator;
  10. @ccclass('LeaderSkill')
  11. export class LeaderSkill extends Component {
  12. @property({ type: Node, tooltip: "特效层级" }) layer: Node;
  13. @property({ type: Node, tooltip: "阻挡墙层级" }) wallLayer: Node;
  14. @property({ type: Node, tooltip: "战斗层" }) battleNode: Node;
  15. @property({ type: Node, tooltip: "背景层" }) bgNode: Node;
  16. @property({ type: Node, tooltip: "2倍背景层" }) d_bgNode: Node;
  17. @property({ type: [Prefab], tooltip: "技能预制体" }) prefabs: Array<Prefab> = [];
  18. @property({ type: Prefab, tooltip: "展示预制体" }) showPrefab: Prefab;
  19. @property({ type: Node, tooltip: "统帅特写层" }) leaderShow: Node;
  20. update() {
  21. DataSystem.watch(BattleData, "useLeaderSkill") && this.show();
  22. }
  23. public show(): void {
  24. tween(this.battleNode).to(0.2, { scale: v3(2, 2, 1) }).call(() => {
  25. this.bgNode.active = !(this.d_bgNode.active = true);
  26. }).start();
  27. let node = instantiate(this.showPrefab);
  28. node.setParent(this.leaderShow);
  29. node.getComponent(LeaderSkillShow).setData(DataSystem.getData(BattleData).useLeaderSkill.id, DataSystem.getData(BattleData).heros.get(5).id, this.useLeaderSkill.bind(this));
  30. }
  31. public async useLeaderSkill() {
  32. this.battleNode.setScale(v3(1, 1, 1));
  33. this.bgNode.active = !(this.d_bgNode.active = false);
  34. // GM.addBattleLog(`使用统帅技能:` + JSON.stringify(DataSystem.getData(BattleData).useLeaderSkill));
  35. switch (DataSystem.getData(BattleData).useLeaderSkill.id) {
  36. case 1: case 2:
  37. let tempMonsterArray = DataSystem.getData(BattleData)._monsters.concat();
  38. for (let i = 0; i < tempMonsterArray.length; i++) {
  39. await this.createPrefabs(DataSystem.getData(BattleData).useLeaderSkill.id, DataSystem.getData(BattleData).useLeaderSkill.lv, tempMonsterArray[i]);
  40. }
  41. break;
  42. case 3:
  43. let monster = DataSystem.getData(BattleData)._monsters.sort((a, b) => {
  44. if (a.getComponent(TakeAWalk).totleWalkFarme > b.getComponent(TakeAWalk).totleWalkFarme) {
  45. return -1;
  46. }
  47. return 1;
  48. })
  49. this.createPrefabs(DataSystem.getData(BattleData).useLeaderSkill.id, DataSystem.getData(BattleData).useLeaderSkill.lv, monster[0]);
  50. break;
  51. }
  52. }
  53. private createPrefabs(id: number, lv: number, monster: Monster) {
  54. return new Promise<any>(async (resolve: (data: any) => void) => {
  55. if (monster) {
  56. let node = instantiate(this.prefabs[id - 1]);
  57. if (id < 3) {
  58. node.setRotationFromEuler(v3(0, 0, 45));
  59. node.setPosition(v3(monster.node.position.x + Math.cos(45) * 300, monster.node.position.y + Math.sin(45) + 300, 0));
  60. }
  61. node.setParent(id == 3 && monster.getComponent(TakeAWalk).direction == WalkDirection.up ? this.wallLayer : this.layer);
  62. node.getComponent(LeaderSkillNode).setData(id, lv, monster);
  63. }
  64. this.scheduleOnce(() => {
  65. resolve(null);
  66. }, 0.1);
  67. });
  68. }
  69. }