You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AdLike2048/assets/script/battle/view/DragPlaceLinePresenter.ts

59 lines
1.8 KiB

3 weeks ago
import { Node, UITransform, Vec3 } from 'cc';
/**
* 背包字块拖拽到地图时,ui_line 从字块中心指向目标格中心。
* 仅设置 ui_line 根节点 Content Size 的 width(配合 Mask 裁剪子节点线条图),不拉伸子图。
*/
export class DragPlaceLinePresenter {
private _root: Node | null = null;
private _defaultHeight = 9;
bind(root: Node | null): void {
this._root = root?.isValid ? root : null;
if (!this._root) return;
const ut = this._root.getComponent(UITransform);
if (ut) {
this._defaultHeight = ut.contentSize.height;
}
this.hide();
}
unbind(): void {
this.hide();
this._root = null;
}
/** 从起点世界坐标拉线到终点世界坐标 */
show(fromWorld: Readonly<Vec3>, toWorld: Readonly<Vec3>): void {
if (!this._root?.isValid) return;
const parent = this._root.parent;
const parentUt = parent?.getComponent(UITransform);
if (!parentUt) return;
const startLocal = parentUt.convertToNodeSpaceAR(new Vec3(fromWorld.x, fromWorld.y, fromWorld.z));
const endLocal = parentUt.convertToNodeSpaceAR(new Vec3(toWorld.x, toWorld.y, toWorld.z));
const dx = endLocal.x - startLocal.x;
const dy = endLocal.y - startLocal.y;
const dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 1) {
this.hide();
return;
}
const angle = Math.atan2(dy, dx) * 180 / Math.PI;
this._root.active = true;
this._root.setPosition(startLocal);
this._root.angle = angle;
const ut = this._root.getComponent(UITransform);
ut?.setContentSize(dist, this._defaultHeight);
}
hide(): void {
if (this._root?.isValid) {
this._root.active = false;
}
}
}