// Learn TypeScript: // - https://docs.cocos.com/creator/manual/en/scripting/typescript.html // Learn Attribute: // - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html // Learn life-cycle callbacks: // - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html const {ccclass, property} = cc._decorator; import UIBase from "../../common/ui/base/UIBase"; import ToolFunc from "../ToolFunc"; import venueLayer from "../ui/UISingleVenueLayer"; export enum State{ IN = 0, STAND = 1, WALK = 2, OUT = 3, END = 4, STOP = 5 } @ccclass export default class touristModule extends UIBase { @property(cc.Sprite) singleTourist:cc.Sprite = null; @property maxDelayTime = 3.0; @property minMoveTime = 3.0; @property moveDistantTime = 1.0; parent = null; startPos = cc.v2(0,-510) endPos = cc.v2(0,510) inPos = cc.v2(0,-400) outPos = cc.v2(0,400) actionIndex = 4; arrMajorPos = []; arrMajorRoutePos = []; arrMiddleRoutePos = []; radomActionTimes = 0; touritstState = State.STOP; activeMaxY:cc.Vec2 = cc.v2(0,0); activeMinY:cc.Vec2 = cc.v2(0,0); remainCount:number = 0; routeMajorState:number = 0; goalPos:cc.Vec2 = cc.v2(0,0); arrGoalDirection:Array = [true,true]; standKeepTimeCount:number = 0; @property speed:number= 50; tempObj = null; // LIFE-CYCLE CALLBACKS: init(node:cc.Node):void { this.singleTourist.node.x = 0; this.singleTourist.node.y = 0; let jumpUpDown = cc.tween() .by(0.1,{position:cc.v2(0,20)}) .by(0.1,{position:cc.v2(0,-20)}); this.parent = node.getComponent(venueLayer); this.tempObj = cc.tween(this.singleTourist.node).then(jumpUpDown).repeatForever().start(); // this.arrMajorRoutePos = [ // ToolFunc.ins.getNodeRoutePosition(this.parent.singleAreaBtnArr[0]), // ToolFunc.ins.getNodeRoutePosition(this.parent.singleAreaBtnArr[1]), // ToolFunc.ins.getNodeRoutePosition(this.parent.singleAreaBtnArr[2]), // ToolFunc.ins.getNodeRoutePosition(this.parent.singleAreaBtnArr[3]) // ] this.arrMajorPos = [ this.inPos, ToolFunc.ins.getNodePosition(this.parent.singleAreaBtnArr[3]), ToolFunc.ins.getNodePosition(this.parent.singleAreaBtnArr[2]), ToolFunc.ins.getNodePosition(this.parent.singleAreaBtnArr[1]), ToolFunc.ins.getNodePosition(this.parent.singleAreaBtnArr[0]), this.outPos, ] // this.arrMiddleRoutePos = [ // ToolFunc.ins.getNodeMiddlePosition(this.parent.singleAreaBtnArr[0]), // ToolFunc.ins.getNodeMiddlePosition(this.parent.singleAreaBtnArr[1]), // ToolFunc.ins.getNodeMiddlePosition(this.parent.singleAreaBtnArr[2]), // ToolFunc.ins.getNodeMiddlePosition(this.parent.singleAreaBtnArr[3]) // ] this.touritstState = State.IN; this.routeMajorState = 0; //this.planRoad() } // planRoad():void // { // let tNode = this.node; // let tParentNode = this.parent; // let bezierobj =[tParentNode.startPos,this.arrMajorRoutePos[3],this.arrMajorRoutePos[3]]; // cc.tween(tNode) // .then(cc.bezierTo(3,bezierobj)) // .call(() => this.planRoadSingle()) // .start() // } // planRoadSingle(tweenObj?):void // { // if (this.actionIndex === 0) { // if(tweenObj) // { // tweenObj.stop(); // this.tempObj.stop(); // } // this.recycleTourist(); // return // } // this.actionIndex = this.actionIndex - 1; // let tParentNode = this.parent; // let posTemp = this.arrMajorRoutePos[this.actionIndex]; // let bezier1 =[posTemp,this.arrMiddleRoutePos[this.actionIndex],this.arrMajorPos[this.actionIndex]]; // posTemp = this.arrMajorPos[this.actionIndex]; // if (this.actionIndex === 0) { // let tweenObj = cc.tween(this.node) // .then(cc.bezierTo(this.minMoveTime+(Math.random()*this.moveDistantTime),bezier1)) // .delay(this.maxDelayTime * Math.random()) // .to((this.minMoveTime+(Math.random()*this.moveDistantTime)),{position:this.parent.endPos}) // .delay(this.maxDelayTime * Math.random()) // .call(() => this.planRoadSingle(tweenObj)) // .start() // return // } // let bezier2 =[posTemp,this.arrMiddleRoutePos[this.actionIndex - 1],this.arrMajorRoutePos[this.actionIndex - 1]]; // cc.tween(this.node) // .then(cc.bezierTo(this.minMoveTime+(Math.random()*this.moveDistantTime),bezier1)) // .delay(this.maxDelayTime * Math.random()) // .then(cc.bezierTo(this.minMoveTime+(Math.random()*this.moveDistantTime),bezier2)) // .delay(this.maxDelayTime * Math.random()) // .call(() => this.planRoadSingle()) // .start() // } recycleTourist():void { this.parent.recycleTourist(this.node); } onLoad () { } moveToNode(node:cc.Node,posX:cc.Vec2,posY:cc.Vec2,dt):void { let distance = ToolFunc.ins.getDistance( posX.y, posY.y); let height = distance[0]; let heightDirection = distance[1]; distance = ToolFunc.ins.getDistance( posX.x, posY.x); let width = distance[0]; let widthDirection = distance[1]; let trd = Math.sqrt(Math.pow(height,2)+Math.pow(width,2)); let time = trd/this.speed; let Vtx = (width/time)*widthDirection; let Vty = (height/time)*heightDirection; this.node.x = this.node.x + (Vtx*dt) this.node.y = this.node.y + (Vty*dt) } onStateStand():void{ this.touritstState = State.STAND; this.standKeepTimeCount = 0; } // private _touritstState : number; // public get touritstState() : number { // return this._touritstState; // } // public set touritstState(v : number) { // this._touritstState = v; // } update(dt) { if(this.touritstState === State.IN) { this.moveToNode(this.node,this.startPos,this.inPos,dt); //启动 if(this.node.y >= this.inPos.y) { this.routeMajorState++; this.touritstState++; //this.touritstState = State.STAND; this.onStateStand(); } } else if(this.touritstState === State.WALK) { //移动函数 根据新定位的坐标点 时间 逐帧前进 this.moveToNode(this.node,ToolFunc.ins.getPosition(this.node),this.goalPos,dt); let nodePos = ToolFunc.ins.getPosition(this.node); if(this.compareWithTwoNode(nodePos,this.goalPos)) //如果到地方了 { //this.touritstState = State.STAND; this.onStateStand(); this.standKeepTimeCount = 0; } } else if(this.touritstState === State.STAND) { if((this.standKeepTimeCount === 0) && ToolFunc.ins.radomIfDoAction()) { this.talk(); } this.standKeepTimeCount ++; if(this.standKeepTimeCount === 60) { //选择新的坐标点 确定移动时间 this.standKeepTimeCount = 0; this.choiceNode(); } } else if(this.touritstState === State.OUT) { this.moveToNode(this.node,ToolFunc.ins.getPosition(this.node),this.outPos,dt); //启动 if(this.node.y >= this.outPos.y) { this.routeMajorState++; this.touritstState++; //this.touritstState = State.STAND; this.touritstState = State.END } } else if(this.touritstState === State.END) { this.moveToNode(this.node,ToolFunc.ins.getPosition(this.node),this.endPos,dt); //启动 if(this.node.y >= this.endPos.y) { this.touritstState = State.STOP this.recycleTourist() } } } choiceNode():void { if(this.routeMajorState >= 5) { this.touritstState = State.OUT; return } if(ToolFunc.ins.radomIfDoAction() || this.remainCount >=3) { //升级移动 this.remainCount = 0; if(ToolFunc.ins.radomIfDoAction()) { //跳过场馆直接进入升级平行移动 this.routeMajorState++; this.getParallelNode(); } else { //进入场馆 this.goalPos = this.arrMajorPos[this.routeMajorState]; this.routeMajorState++; } } else { //同级平行移动 this.getParallelNode(); } let nodePos = ToolFunc.ins.getPosition(this.node); this.recordWithTwoNode(nodePos,this.goalPos); this.touritstState = State.WALK; } getParallelNode():void//获取平行移动节点 { this.remainCount++; if(this.routeMajorState>=6) { let aaa; } let height = (this.arrMajorPos[this.routeMajorState].y - this.node.y) * Math.random() + this.node.y; let width = this.parent.node.width * Math.random() - (this.parent.node.width)*0.5; this.goalPos = cc.v2(width,height); } recordWithTwoNode(startPos:cc.Vec2,endPos:cc.Vec2):void { if(startPos.x >= endPos.x) { this.arrGoalDirection[0] = false; } else { this.arrGoalDirection[0] = true; } if(startPos.y >= endPos.y) { this.arrGoalDirection[1] = false; } else { this.arrGoalDirection[1] = true; } } compareWithTwoNode(startPos:cc.Vec2,endPos:cc.Vec2):boolean { let bSurpassX = false; let bSurpassY = false; let isRight = this.arrGoalDirection[0]; let isUp = this.arrGoalDirection[1]; if(isRight) { if(startPos.x >= endPos.x) { bSurpassX = true; } } else{ if(startPos.x <= endPos.x) { bSurpassX = true; } } if(isUp) { if(startPos.y >= endPos.y) { bSurpassY = true; } } else{ if(startPos.y <= endPos.y) { bSurpassY = true; } } if(bSurpassX && bSurpassY) { return true; } return false; } reset():void { this.tempObj.stop(); this.singleTourist.node.x = 0; this.singleTourist.node.y = 0; } talk():void { } start () { } // update (dt) {} }