Files
slgclient/assets/scripts/map/entries/ArmyLogic.ts
2025-11-18 18:38:53 +08:00

124 lines
4.7 KiB
TypeScript

import { ArmyData } from "../../general/ArmyProxy";
import DateUtil from "../../utils/DateUtil";
import MapUtil from "../MapUtil";
import { Vec2, Node, Animation, Vec3, UITransform } from "cc";
export default class ArmyLogic {
public data: ArmyData = null;
public aniNode: Node = null;
public arrowNode: Node = null;
protected _parentLayer: Node;
protected _aniName: string = "";
protected _startPixelPos: Vec3 = new Vec3(0, 0, 0);
protected _endPixelPos: Vec3 = new Vec3(0, 0, 0);
protected _lenX: number = 0;
protected _lenY: number = 0;
public clear() {
this.data = null;
this.aniNode = null;
this.arrowNode = null;
this._parentLayer = null;
}
public destroy(): void {
this.aniNode.parent = null;
this.arrowNode.parent = null;
this.clear();
}
public update(): Vec2 {
if (this.data && this.data.state > 0) {
let nowTime: number = DateUtil.getServerTime();
if (nowTime < this.data.endTime) {
//代表移动中
let percent: number = Math.max(0, (nowTime - this.data.startTime) / (this.data.endTime - this.data.startTime));
let pos = this.aniNode.position.clone();
pos.x = this._startPixelPos.x + percent * this._lenX;
pos.y = this._startPixelPos.y + percent * this._lenY;
this.aniNode.setPosition(pos);
let cellPoint: Vec2 = MapUtil.mapPixelToCellPoint(new Vec2(pos.x, pos.y));
this.data.x = cellPoint.x;
this.data.y = cellPoint.y;
} else {
this.aniNode.setPosition(this._endPixelPos);
this.data.x = this.data.toX;
this.data.y = this.data.toY;
}
this.updateArrow();
return new Vec2(this.data.x, this.data.y);
}
return null;
}
protected updateArrow(): void {
this.arrowNode.active = this.data && this.data.state > 0;
if (this.arrowNode.active == true) {
this.arrowNode.setPosition(this.aniNode.getPosition());
let len: number = Math.sqrt(
Math.abs((this._endPixelPos.y - this.arrowNode.position.y) * (this._endPixelPos.y - this.arrowNode.position.y))
+ Math.abs((this._endPixelPos.x - this.arrowNode.position.x) * (this._endPixelPos.x - this.arrowNode.position.x)));
let angle: number = Math.atan2(this._endPixelPos.y - this.arrowNode.position.y, this._endPixelPos.x - this.arrowNode.position.x);
this.arrowNode.angle = angle * 180 / Math.PI + 90;
this.arrowNode.getComponent(UITransform).height = len;
}
}
public setArmyData(data: ArmyData, aniNode: Node, arrowNode: Node): void {
this.data = data;
this.aniNode = aniNode;
this.arrowNode = arrowNode;
let startPos:Vec2 = MapUtil.mapCellToPixelPoint(new Vec2(this.data.fromX, this.data.fromY));
this._startPixelPos.x = startPos.x;
this._startPixelPos.y = startPos.y;
let endPos:Vec2 = MapUtil.mapCellToPixelPoint(new Vec2(this.data.toX, this.data.toY));
this._endPixelPos.x = endPos.x;
this._endPixelPos.y = endPos.y;
this._lenX = this._endPixelPos.x - this._startPixelPos.x;
this._lenY = this._endPixelPos.y - this._startPixelPos.y;
let pos = MapUtil.mapCellToPixelPoint(new Vec2(this.data.x, this.data.y));
this.aniNode.setPosition(new Vec3(pos.x, pos.y, 0));
this._aniName = "qb_run_r";
if (this._startPixelPos.y == this._endPixelPos.y) {
//平行
if (this._startPixelPos.x < this._endPixelPos.x) {
this._aniName = "qb_run_r";
} else {
this._aniName = "qb_run_l";
}
} else if (this._startPixelPos.y < this._endPixelPos.y) {
//往上走
if (this._startPixelPos.x < this._endPixelPos.x) {
this._aniName = "qb_run_ru";
} else if (this._startPixelPos.x == this._endPixelPos.x) {
this._aniName = "qb_run_u";
} else {
this._aniName = "qb_run_lu";
}
} else if (this._startPixelPos.y > this._endPixelPos.y) {
//往下走
if (this._startPixelPos.x < this._endPixelPos.x) {
this._aniName = "qb_run_rd";
} else if (this._startPixelPos.x == this._endPixelPos.x) {
this._aniName = "qb_run_d";
} else {
this._aniName = "qb_run_ld";
}
}
this.aniNode.getComponent(Animation).play(this._aniName);
this.updateArrow();
}
}