From b289a4c397c65f40aa89d13604a51f9f13a0328f Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期六, 19 十月 2024 10:17:50 +0800
Subject: [PATCH] #

---
 zy-acs-flow/src/map/tool.js |  187 +++++++++++++++++++++++++++++++++-------------
 1 files changed, 132 insertions(+), 55 deletions(-)

diff --git a/zy-acs-flow/src/map/tool.js b/zy-acs-flow/src/map/tool.js
index 9bb38d2..8f942a9 100644
--- a/zy-acs-flow/src/map/tool.js
+++ b/zy-acs-flow/src/map/tool.js
@@ -330,83 +330,160 @@
     }
 }
 
+
+// export const showSelectedEffect = (sprite) => {
+//     if (!sprite?.texture || !sprite?.texture?.valid) {
+//         return;
+//     }
+//     const { width, height } = sprite;
+//     const scale = sprite.scale.x;
+//     const sideLen = (Math.max(width, height) + 10) * scale;
+//     const color = themeMode === 'light' ? 0x273c75 : 0xffffff;
+
+//     effectHalfCircle = new PIXI.Graphics();
+//     effectHalfCircle.beginFill(color);
+//     effectHalfCircle.lineStyle(2 * scale, color);
+//     effectHalfCircle.arc(0, 0, sideLen, 0, Math.PI);
+//     effectHalfCircle.endFill();
+//     effectHalfCircle.position.set(sprite.x, sprite.y);
+//     effectHalfCircle.scale.set(1 / scale);
+//     effectHalfCircle.zIndex = 9999;
+
+//     effectRectangle = new PIXI.Graphics();
+//     effectRectangle.lineStyle(5 * scale, color, 1);
+//     effectRectangle.drawRoundedRect(0, 0, sideLen, sideLen, 16 * scale);
+//     effectRectangle.endFill();
+//     effectRectangle.mask = effectHalfCircle;
+//     effectRectangle.zIndex = 9999;
+
+//     const scaledWidth = sideLen * (1 / scale);
+//     const scaledHeight = sideLen * (1 / scale);
+
+//     effectRectangle.scale.set(1 / scale);
+//     effectRectangle.position.set(sprite.x - scaledWidth / 2, sprite.y - scaledHeight / 2);
+
+//     mapContainer.addChild(effectRectangle);
+//     mapContainer.addChild(effectHalfCircle);
+
+//     selectedSprite = sprite;
+
+//     let phase = 0;
+//     effectTick = (delta) => {
+//         phase += delta / 10;
+//         phase %= (Math.PI * 2);
+//         if (effectHalfCircle) {
+//             effectHalfCircle.rotation = phase;
+//         }
+//     };
+
+//     app.ticker.add(effectTick);
+// }
+
+// export const removeSelectedEffect = () => {
+//     if (effectTick) {
+//         app.ticker.remove(effectTick);
+//     }
+//     if (effectHalfCircle) {
+//         mapContainer.removeChild(effectHalfCircle);
+//         effectHalfCircle = null;
+//     }
+//     if (effectRectangle) {
+//         mapContainer.removeChild(effectRectangle);
+//         effectRectangle = null;
+//     }
+//     selectedSprite = null;
+// }
+
+// export const updateEffect = (sprite) => {
+//     if (!sprite || sprite !== selectedSprite || !effectRectangle || !effectHalfCircle) {
+//         return
+//     }
+//     const { width, height } = sprite;
+//     const scale = sprite?.scale.x;
+//     const sideLen = (Math.max(width, height) + 10) * scale;
+//     const scaledWidth = sideLen * (1 / scale);
+//     const scaledHeight = sideLen * (1 / scale);
+
+//     effectRectangle.position.set(sprite.x - scaledWidth / 2, sprite.y - scaledHeight / 2);
+
+//     effectHalfCircle.position.set(sprite.x, sprite.y);
+// }
+
+let effectCircle = null;
+let effectTicker = null;
+
 export const showSelectedEffect = (sprite) => {
     if (!sprite?.texture || !sprite?.texture?.valid) {
         return;
     }
+
+    // 濡傛灉宸茬粡鏈夌壒鏁堬紝鍏堢Щ闄�
+    removeSelectedEffect();
+
     const { width, height } = sprite;
     const scale = sprite.scale.x;
-    const sideLen = (Math.max(width, height) + 10) * scale;
+    const maxDimension = Math.max(width, height);
+    const radius = (maxDimension / 2) * scale * 1.2; // 鏀惧ぇ1.2鍊嶏紝浣垮渾绋嶅ぇ浜巗prite
+
     const color = themeMode === 'light' ? 0x273c75 : 0xffffff;
 
-    effectHalfCircle = new PIXI.Graphics();
-    effectHalfCircle.beginFill(color);
-    effectHalfCircle.lineStyle(2 * scale, color);
-    effectHalfCircle.arc(0, 0, sideLen, 0, Math.PI);
-    effectHalfCircle.endFill();
-    effectHalfCircle.position.set(sprite.x, sprite.y);
-    effectHalfCircle.scale.set(1 / scale);
-    effectHalfCircle.zIndex = 9999;
+    // 鍒涘缓鍦嗗舰鐗规晥
+    effectCircle = new PIXI.Graphics();
+    effectCircle.lineStyle(2 * scale, color, 1);
+    effectCircle.drawCircle(0, 0, radius);
+    effectCircle.endFill();
+    effectCircle.position.set(sprite.x, sprite.y);
+    effectCircle.zIndex = sprite.zIndex - 1; // 纭繚涓嶉伄鎸prite
 
-    effectRectangle = new PIXI.Graphics();
-    effectRectangle.lineStyle(5 * scale, color, 1);
-    effectRectangle.drawRoundedRect(0, 0, sideLen, sideLen, 16 * scale);
-    effectRectangle.endFill();
-    effectRectangle.mask = effectHalfCircle;
-    effectRectangle.zIndex = 9999;
-
-    const scaledWidth = sideLen * (1 / scale);
-    const scaledHeight = sideLen * (1 / scale);
-
-    effectRectangle.scale.set(1 / scale);
-    effectRectangle.position.set(sprite.x - scaledWidth / 2, sprite.y - scaledHeight / 2);
-
-    mapContainer.addChild(effectRectangle);
-    mapContainer.addChild(effectHalfCircle);
+    // 灏嗙壒鏁堟坊鍔犲埌瀹瑰櫒涓�
+    mapContainer.addChild(effectCircle);
 
     selectedSprite = sprite;
 
-    let phase = 0;
-    effectTick = (delta) => {
-        phase += delta / 10;
-        phase %= (Math.PI * 2);
-        if (effectHalfCircle) {
-            effectHalfCircle.rotation = phase;
+    // 瀹炵幇鑴夊啿鏁堟灉
+    let pulseScale = 1;
+    let scalingUp = true;
+    effectTicker = (delta) => {
+        const pulseSpeed = 0.005 * delta;
+        if (scalingUp) {
+            pulseScale += pulseSpeed;
+            if (pulseScale >= 1.2) {
+                scalingUp = false;
+            }
+        } else {
+            pulseScale -= pulseSpeed;
+            if (pulseScale <= 1) {
+                scalingUp = true;
+            }
         }
+        effectCircle.scale.set(pulseScale);
+        // 濮嬬粓璺熼殢sprite鐨勪綅缃�
+        effectCircle.position.set(selectedSprite.x, selectedSprite.y);
     };
 
-    app.ticker.add(effectTick);
-}
+    app.ticker.add(effectTicker);
+};
 
 export const removeSelectedEffect = () => {
-    if (effectTick) {
-        app.ticker.remove(effectTick);
+    if (effectTicker) {
+        app.ticker.remove(effectTicker);
+        effectTicker = null;
     }
-    if (effectHalfCircle) {
-        mapContainer.removeChild(effectHalfCircle);
-        effectHalfCircle = null;
-    }
-    if (effectRectangle) {
-        mapContainer.removeChild(effectRectangle);
-        effectRectangle = null;
+    if (effectCircle) {
+        mapContainer.removeChild(effectCircle);
+        effectCircle.destroy();
+        effectCircle = null;
     }
     selectedSprite = null;
-}
+};
 
-export const updateEffect = (sprite) => {
-    if (!sprite || sprite !== selectedSprite || !effectRectangle || !effectHalfCircle) {
-        return
+export const updateEffect = () => {
+    if (!selectedSprite || !effectCircle) {
+        return;
     }
-    const { width, height } = sprite;
-    const scale = sprite?.scale.x;
-    const sideLen = (Math.max(width, height) + 10) * scale;
-    const scaledWidth = sideLen * (1 / scale);
-    const scaledHeight = sideLen * (1 / scale);
-
-    effectRectangle.position.set(sprite.x - scaledWidth / 2, sprite.y - scaledHeight / 2);
-
-    effectHalfCircle.position.set(sprite.x, sprite.y);
-}
+    // 鏇存柊鍦嗙殑浣嶇疆锛岀‘淇濊窡闅弒prite
+    effectCircle.position.set(selectedSprite.x, selectedSprite.y);
+};
 
 export const multipleSelectEnhancer = (selectedSprites, setCurSprite, setBatchSprites) => {
     selectedSprites = selectedSprites.filter(sprite => sprite.data?.type);

--
Gitblit v1.9.1