nest.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import { ResMgr } from "../res/resMgr";
  2. import { ConfigConst } from "../cfg/ConfigDef";
  3. import { ConfigMgr } from "../cfg/configMgr";
  4. import { Utils } from "../common/utils";
  5. import MoveDest from "../update/moveDest";
  6. interface INest {
  7. num: number;
  8. delay: number;
  9. behavior: number;
  10. pos: string;
  11. }
  12. export interface IBehavior {
  13. next: number;
  14. loop: number;
  15. time: number;
  16. path: number;
  17. }
  18. interface IPath {
  19. type: number;
  20. value: string;
  21. }
  22. enum NestState {
  23. init,
  24. moving,
  25. }
  26. export class Nest {
  27. data: INest;
  28. parent: cc.Node;
  29. selfNode: cc.Node;
  30. pathData: IPath;
  31. step: number = 0;
  32. behaviors: IBehavior[];
  33. state: NestState = NestState.init;
  34. nextTime: number;
  35. constructor(data, parent: cc.Node) {
  36. this.data = data;
  37. this.parent = parent;
  38. let node = new cc.Node('nest');
  39. node.setPosition(Utils.pos2vec2(this.data.pos));
  40. parent.addChild(node);
  41. this.selfNode = node;
  42. cc.director.getScheduler().enableForTarget(this);
  43. let behaviorId: any = this.data.behavior;
  44. let arr = [];
  45. while (behaviorId != '' && behaviorId > 0) {
  46. let bdata = ConfigMgr.inst.getCfgById(ConfigConst.behavior, behaviorId) as IBehavior;
  47. arr.push(bdata);
  48. behaviorId = bdata.next;
  49. }
  50. this.behaviors = arr;
  51. }
  52. async begin() {
  53. this.step = 0;
  54. await this.oneBehavior();
  55. // cc.director.getScheduler().schedule(this.update, this, 1, cc.macro.REPEAT_FOREVER, 0, false);
  56. cc.director.getScheduler().scheduleUpdate(this, 1, false);
  57. }
  58. update(dt) {
  59. if(this.state != NestState.moving) return;
  60. if(Date.now() <= this.nextTime) return;
  61. let flag = true;
  62. for (let index = 0; index < this.selfNode.children.length; index++) {
  63. const element = this.selfNode.children[index];
  64. let cMoveDest = element.getComponent(MoveDest);
  65. if(!cMoveDest.isDone()){
  66. flag = false;
  67. break;
  68. }
  69. }
  70. if(flag) {
  71. this.nextBehavior();
  72. }
  73. }
  74. end() {
  75. cc.director.getScheduler().unscheduleUpdate(this);
  76. }
  77. private async oneBehavior() {
  78. let bdata = this.behaviors[this.step];
  79. this.state = NestState.init;
  80. if(this.step == 0){
  81. let res = await ResMgr.inst.getPrefab('monster/monster');
  82. for (let index = 0; index < this.data.num; index++) {
  83. let node = new cc.Node('monsterPath');
  84. this.selfNode.addChild(node);
  85. ResMgr.inst.createNode(res, node);
  86. node.addComponent(MoveDest);
  87. }
  88. }
  89. if(bdata.path as unknown != '') {
  90. let pathData = ConfigMgr.inst.getCfgById(ConfigConst.path, bdata.path) as IPath;
  91. for (let index = 0; index < this.selfNode.childrenCount; index++) {
  92. let node = this.selfNode.children[index];
  93. let monsterNode = node.children[0];
  94. let monsterSize = monsterNode.getContentSize();
  95. let cMoveDest = node.getComponent(MoveDest);
  96. let dest = Utils.pos2vec2(pathData.value);
  97. cMoveDest.destination = dest;
  98. cMoveDest.speed = dest.mag() / bdata.time;
  99. let angle = cc.v2(0, -1).signAngle(dest) / Math.PI * 180;
  100. monsterNode.angle = Math.round(angle * 100) / 100;
  101. let normalDest = dest.normalize();
  102. monsterNode.y = -index * monsterSize.height * normalDest.y;
  103. monsterNode.x = -index * monsterSize.width * normalDest.x;
  104. }
  105. }
  106. this.state = NestState.moving;
  107. this.nextTime = Date.now() + bdata.time * 1000;
  108. }
  109. nextBehavior(){
  110. this.step ++;
  111. if(this.step >= this.behaviors.length) {
  112. this.end();
  113. }
  114. else{
  115. this.oneBehavior();
  116. }
  117. }
  118. }