123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- import { _decorator, BoxCollider2D, CCBoolean, CircleCollider2D, Collider2D, Color, Node, Component, Contact2DType, Input, IPhysics2DContact, PhysicsSystem2D, PolygonCollider2D, RigidBody2D, Sprite, Rect, Enum, HingeJoint2D, Vec2 } from 'cc';
- import { CarColorHex, CarColorLog, CarColors } from '../CarColorsGlobalTypes';
- import { HoleComponent } from './HoleComponent';
- import { LayerAction } from '../LayerAction';
- import { UnitAction } from '../UnitAction';
- import { GameUtil } from '../GameUtil';
- const { ccclass, property, executeInEditMode } = _decorator;
- /** 钉子组件*/
- @ccclass('PinComponent')
- @executeInEditMode
- export class PinComponent extends Component {
- @property({ type: Enum(CarColors) })
- get pin_color() {
- return this._pin_color
- }
- set pin_color(value) {
- this._pin_color = value
- this.changeColor()
- }
- @property({ type: Enum(CarColors) })
- private _pin_color: CarColors = CarColors.Purple
- isBlocked: boolean = false;
- isProcessing: boolean = false;
- pos_hole: HoleComponent = null;
- start() {
- // this.checkBlocking();
- }
- // 获取当前 pin 所属的 layer 节点
- private getParentLayer(node: Node): Node | null {
- let current = node.parent;
- while (current) {
- if (current.parent?.getComponent(UnitAction)) {
- return current;
- }
- current = current.parent!;
- }
- return null;
- }
- // 获取当前层以上的所有 layer
- private getHigherLayers(currentLayer: Node): Node[] {
- const unitNode = currentLayer.parent;
- if (!unitNode) return [];
- const layers = unitNode.children
- .filter((child) => child.name.startsWith('layer_'))
- .sort((a, b) => parseInt(a.name.split('_')[1]) - parseInt(b.name.split('_')[1]));
- const currentIndex = layers.indexOf(currentLayer);
- return layers.slice(currentIndex + 1); // 获取当前层以上的所有层
- }
- // 获取当前 pin 的包围盒
- private getWorldBoundingBox(): Rect | null {
- const collider = this.node.getComponent(CircleCollider2D);
- if (!collider) return null;
- const aabb = collider.worldAABB;
- return new Rect(aabb.xMin, aabb.yMin, aabb.width, aabb.height);
- }
- // 检查是否被遮挡
- checkBlocking() {
- const pinBoundingBox = this.getWorldBoundingBox();
- if (!pinBoundingBox) return;
- // 获取当前 pin 所在的 layer
- const currentLayer = this.getParentLayer(this.node);
- if (!currentLayer) return;
- // 获取当前层以上的所有 layer
- const higherLayers = this.getHigherLayers(currentLayer);
- if (higherLayers.length === 0) return;
- // 遍历所有高层 layer 的碰撞组件,判断是否有相交
- // this.isBlocked = higherLayers.some((layer) => {
- // const colliders = layer.getComponentsInChildren(PolygonCollider2D)!;
- // return colliders.some((collider) => {
- // const otherBoundingBox = collider.worldAABB;
- // return pinBoundingBox.intersects(new Rect(
- // otherBoundingBox.xMin,
- // otherBoundingBox.yMin,
- // otherBoundingBox.width,
- // otherBoundingBox.height
- // ));
- // });
- // });
- const circleCollider2D = this.node.getComponent(CircleCollider2D);
- this.isBlocked = higherLayers.some((layer) => {
- const colliders = layer.getComponentsInChildren(PolygonCollider2D)!;
- return colliders.some((otherCollider) => {
- return GameUtil.isPolygonAndCircleIntersecting(otherCollider, circleCollider2D)
- });
- });
- if (this.isBlocked) {
- // console.log(`${CarColorLog[this.pin_color]} 被遮挡了`);
- } else {
- // console.log(`${CarColorLog[this.pin_color]} 未被遮挡了,可以溜`);
- }
- }
- public init_date(group_id: number, pin_color: CarColors, hole: HoleComponent) {
- this.pos_hole = hole;
- this.node.getComponent(RigidBody2D).group = group_id;
- this._pin_color = pin_color;
- //set color
- this.reset_img();
- }
- reset_img() {
- if (!this._pin_color) {
- console.log(`被return的颜色${this._pin_color}`);
- return;
- }
- this.changeColor();
- // this.pin_img.getComponent(Sprite).color = new Color().fromHEX(CarColorHex[this.pin_color]);
- }
- changeColor() {
- this.node.children.forEach(child => {
- if (child.name === CarColors[this._pin_color]) {
- child.active = true
- } else {
- child.active = false
- }
- })
- }
- protected onDestroy(): void {
- }
- }
|