import SKDataUtil from "../gear/SKDataUtil"; import SKLogger from "../gear/SKLogger"; import Player from "../object/Player"; import { EAIState } from "../role/EEnum"; import MapMgr from "./MapMgr"; import MapModel from "./MapModel"; import PathUtil from "./PathUtil"; export default class AIMgr { private owner: Player; private state: EAIState = EAIState.IDLE; gridWidth: number = 20; gridHeight: number = 20; mapModel: MapModel; lastTime: number = 0; time: number = 0; moveSpeed: number = 100; movePath: any[] = []; endTime: number = 0; constructor(owner: Player) { this.owner = owner; this.mapModel = MapMgr.shared.getMapById(this.owner.mapid); } startMove() { let startX = this.owner.x; let startY = this.owner.y; let pos = this.mapModel.getARandomPos(); let endX = pos.x; let endY = pos.y; this.movePath = this.searchMovePath(startX, startY, endX, endY); this.state = EAIState.MOVE; SKLogger.debug(`AI控制:[${this.owner.roleid}:${this.owner.name}]从[${startX}:${startY}]移动到[${endX},${endY}],需时:${this.endTime / 1000}秒`); } endMove() { this.endTime = SKDataUtil.random(1, 5) * 1000; this.state = EAIState.IDLE; let nx = this.owner.x; let ny = this.owner.y; let params = { accountid: this.owner.accountid, roleId: this.owner.roleid, x: nx, y: ny, }; this.owner.playerStop(params); SKLogger.debug(`AI控制:[${this.owner.roleid}:${this.owner.name}]结束移动[${nx},${ny}]待机${this.endTime / 1000}秒`); } searchMovePath(startX: number, startY: number, endX: number, endY: number) { let availableStart = PathUtil.getAvailabelPoint(startY, startX, this.mapModel.gridInfoArr, this.mapModel.rowCount, this.mapModel.lineCount); let availableEnd = PathUtil.getAvailabelPoint(endY, endX, this.mapModel.gridInfoArr, this.mapModel.rowCount, this.mapModel.lineCount); let result = PathUtil.searchRoad(availableStart.r, availableStart.l, availableEnd.r, availableEnd.l, this.mapModel.gridInfoArr, this.mapModel.rowCount, this.mapModel.lineCount); return result; }; update(dt: number) { if (this.lastTime == 0) { this.lastTime = dt; return; } this.time += dt - this.lastTime; this.lastTime = dt; if (this.endTime == 0) { if (this.state == EAIState.IDLE) { this.startMove(); }else if(this.state==EAIState.MOVE){ } return; } if (this.time > this.endTime) { this.time = this.time - this.endTime; this.endTime = 0; if (this.state == EAIState.MOVE) { this.endMove(); } } }; }