82 lines
2.9 KiB
TypeScript
82 lines
2.9 KiB
TypeScript
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();
|
|
}
|
|
}
|
|
};
|
|
} |