123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- import { ResMgr } from "../res/resMgr";
- import { ConfigConst } from "../cfg/ConfigDef";
- import { ConfigMgr } from "../cfg/configMgr";
- import { Utils } from "../common/utils";
- import MoveDest from "../update/moveDest";
- interface INest {
- num: number;
- delay: number;
- behavior: number;
- pos: string;
- }
- export interface IBehavior {
- next: number;
- loop: number;
- time: number;
- path: number;
- }
- interface IPath {
- type: number;
- value: string;
- }
- enum NestState {
- init,
- moving,
- }
- export class Nest {
- data: INest;
- parent: cc.Node;
- selfNode: cc.Node;
- pathData: IPath;
- step: number = 0;
- behaviors: IBehavior[];
- state: NestState = NestState.init;
- nextTime: number;
- constructor(data, parent: cc.Node) {
- this.data = data;
- this.parent = parent;
- let node = new cc.Node('nest');
- node.setPosition(Utils.pos2vec2(this.data.pos));
- parent.addChild(node);
- this.selfNode = node;
- cc.director.getScheduler().enableForTarget(this);
- let behaviorId: any = this.data.behavior;
- let arr = [];
- while (behaviorId != '' && behaviorId > 0) {
- let bdata = ConfigMgr.inst.getCfgById(ConfigConst.behavior, behaviorId) as IBehavior;
- arr.push(bdata);
- behaviorId = bdata.next;
- }
- this.behaviors = arr;
- }
- async begin() {
- this.step = 0;
- await this.oneBehavior();
- // cc.director.getScheduler().schedule(this.update, this, 1, cc.macro.REPEAT_FOREVER, 0, false);
- cc.director.getScheduler().scheduleUpdate(this, 1, false);
- }
- update(dt) {
- if(this.state != NestState.moving) return;
- if(Date.now() <= this.nextTime) return;
- let flag = true;
- for (let index = 0; index < this.selfNode.children.length; index++) {
- const element = this.selfNode.children[index];
- let cMoveDest = element.getComponent(MoveDest);
- if(!cMoveDest.isDone()){
- flag = false;
- break;
- }
- }
- if(flag) {
- this.nextBehavior();
- }
- }
- end() {
- cc.director.getScheduler().unscheduleUpdate(this);
- }
- private async oneBehavior() {
- let bdata = this.behaviors[this.step];
-
- this.state = NestState.init;
- if(this.step == 0){
- let res = await ResMgr.inst.getPrefab('monster/monster');
- for (let index = 0; index < this.data.num; index++) {
- let node = new cc.Node('monsterPath');
- this.selfNode.addChild(node);
- ResMgr.inst.createNode(res, node);
- node.addComponent(MoveDest);
- }
- }
- if(bdata.path as unknown != '') {
- let pathData = ConfigMgr.inst.getCfgById(ConfigConst.path, bdata.path) as IPath;
- for (let index = 0; index < this.selfNode.childrenCount; index++) {
- let node = this.selfNode.children[index];
- let monsterNode = node.children[0];
-
- let monsterSize = monsterNode.getContentSize();
-
- let cMoveDest = node.getComponent(MoveDest);
- let dest = Utils.pos2vec2(pathData.value);
- cMoveDest.destination = dest;
- cMoveDest.speed = dest.mag() / bdata.time;
-
- let angle = cc.v2(0, -1).signAngle(dest) / Math.PI * 180;
- monsterNode.angle = Math.round(angle * 100) / 100;
-
- let normalDest = dest.normalize();
- monsterNode.y = -index * monsterSize.height * normalDest.y;
- monsterNode.x = -index * monsterSize.width * normalDest.x;
- }
- }
- this.state = NestState.moving;
- this.nextTime = Date.now() + bdata.time * 1000;
- }
- nextBehavior(){
- this.step ++;
- if(this.step >= this.behaviors.length) {
- this.end();
- }
- else{
- this.oneBehavior();
- }
- }
- }
|