@ray-js/robot-map-sdk 0.0.3-beta-5 → 0.0.3-beta-7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/application/Interaction.js +1 -1
  2. package/dist/components/Base/Ring.js +1 -1
  3. package/dist/components/Map/Free.js +1 -1
  4. package/dist/components/Map/Obstacle.js +1 -1
  5. package/dist/index.d.ts +7 -1
  6. package/dist/index.rjs.js +1 -1
  7. package/dist/managers/MapManager.js +1 -1
  8. package/dist/managers/RoomManager.js +1 -1
  9. package/dist-app/assets/{index-Cnc23j8F.js → index-rWbtFkbX.js} +1 -1
  10. package/dist-app/index.html +1 -1
  11. package/dist-docs/404.html +2 -2
  12. package/dist-docs/assets/{app.DRu3YfJm.js → app.C8maVmzs.js} +1 -1
  13. package/dist-docs/assets/chunks/@localSearchIndexroot.BEPmfEXB.js +1 -0
  14. package/dist-docs/assets/chunks/{VPLocalSearchBox.rCdV2UMG.js → VPLocalSearchBox.dmVujmrV.js} +1 -1
  15. package/dist-docs/assets/chunks/{theme.CKuAZ0Ki.js → theme.BkasJq65.js} +2 -2
  16. package/dist-docs/assets/{guide_getting-started.md.Bn2rTf61.js → guide_getting-started.md.CSvzbjhl.js} +1 -1
  17. package/dist-docs/guide/advanced-usage.html +4 -4
  18. package/dist-docs/guide/concepts.html +3 -3
  19. package/dist-docs/guide/getting-started.html +5 -5
  20. package/dist-docs/hashmap.json +1 -1
  21. package/dist-docs/index.html +3 -3
  22. package/dist-docs/reference/callbacks.html +4 -4
  23. package/dist-docs/reference/config.html +4 -4
  24. package/dist-docs/reference/data.html +3 -3
  25. package/dist-docs/reference/methods.html +4 -4
  26. package/dist-docs/reference/runtime.html +4 -4
  27. package/dist-docs/reference/types.html +4 -4
  28. package/dist-docs/reference/utils.html +4 -4
  29. package/package.json +1 -1
  30. package/dist-docs/assets/chunks/@localSearchIndexroot.DYDlqEvf.js +0 -1
  31. /package/dist-docs/assets/{guide_getting-started.md.Bn2rTf61.lean.js → guide_getting-started.md.CSvzbjhl.lean.js} +0 -0
@@ -1 +1 @@
1
- import{Container as t,Graphics as i}from"pixi.js";import{easeInOutCubic as e}from"../utils/index.js";import{getDistance as s}from"../utils/algorithm.js";import{Logger as n}from"../utils/logger.js";import{debounce as a}from"lodash-es";import{useAppService as o}from"./AppService.js";class h extends t{dragStart=null;initialTouchDistance=null;initialScale=null;activeTouches=new Map;firstTouchId=null;secondTouchId=null;zoomFactor=.8;scaleMin=.2;scaleMax=5;originalPosition={x:0,y:0};targetPosition={x:0,y:0};centerPosition={x:0,y:0};originalScale={x:1,y:1};targetScale={x:1,y:1};defaultScale={x:1,y:1};transitionDuration=500;transitionStartTime=null;initialPinchCenter=null;isGestureValid=!0;lastTapTime=0;doubleTapDelay=300;doubleTapZoomFactor=1.5;lastTapPosition=null;tapDistanceThreshold=20;tapDetectionEnabled=!0;isGestureHijacked=!1;hijackedPointerId=null;isHijackPaused=!1;interactionGraphics;viewportBounds;boundResetAnimation;debouncedStopWheelRender;interactionState={isInteracting:!1,isAnimating:!1,interactionTimer:null,renderReasons:new Set};constructor(){super();const t=o().getApp();this.viewportBounds=t.getViewportBounds(),this.eventMode="static",this.interactionGraphics=new i,this.interactionGraphics.rect(this.viewportBounds.x,this.viewportBounds.y,this.viewportBounds.width,this.viewportBounds.height).fill({color:"#ffffff",alpha:0}),this.addChild(this.interactionGraphics),this.scaleMax=t.scaleMax,this.scaleMin=t.scaleMin,this.centerPosition={x:Math.round(this.viewportBounds.x+this.viewportBounds.width/2),y:Math.round(this.viewportBounds.y+this.viewportBounds.height/2)},this.originalPosition={x:Math.round(this.viewportBounds.width/2),y:Math.round(this.viewportBounds.height/2)},this.targetPosition={x:Math.round(this.viewportBounds.width/2),y:Math.round(this.viewportBounds.height/2)},this.boundResetAnimation=this.resetAnimation.bind(this),this.debouncedStopWheelRender=a(()=>{t.stopRender("wheel")},300),this.setupInteraction()}setupInteraction(){this.on("pointerdown",t=>this.onPointerDown(t)),this.on("pointerup",t=>this.onPointerUp(t)),this.on("pointerupoutside",t=>this.onPointerUp(t)),this.on("pointermove",t=>this.onPointerMove(t)),this.on("wheel",t=>this.onWheel(t)),o().emitter.on("gestureHijackStart",this.handleGestureHijacked),document.addEventListener("pointercancel",()=>{this.clearTouches()})}resetPan(t){const i=o(),e=i.getApp(),s=i.appContainer;null!==this.transitionStartTime&&(e.ticker.remove(this.boundResetAnimation),this.transitionStartTime=null);const n=this.centerPosition.x-t.x*s.scale.x,a=this.centerPosition.y-t.y*s.scale.y;this.originalPosition={x:s.x,y:s.y},this.targetPosition={x:n,y:a},this.originalScale={x:s.scale.x,y:s.scale.y},this.targetScale={x:s.scale.x,y:s.scale.y};const h=(r=Math.sqrt((s.x-n)**2+(s.y-a)**2),Math.pow(Math.min(1,r/1e3),.5));var r;this.transitionDuration=500+1e3*Math.min(1,Math.pow(h,2)),this.transitionStartTime=e.ticker.lastTime,e.ticker.add(this.boundResetAnimation)}setPanZoom({targetPosition:t,targetScale:i,setCenter:e=!1,setScale:s=!1}={},a=!0){const h=o(),r=h.getApp(),l=h.appContainer;if(e&&t&&(this.centerPosition={x:t.x,y:t.y},n.debug("[Interaction] Set center position:",this.centerPosition)),s&&i&&(this.defaultScale={x:i.x,y:i.y},this.scaleMin=i.x*r.scaleMin,this.scaleMax=i.x*r.scaleMax,n.debug("[Interaction] Set scale:",this.defaultScale)),this.originalPosition={x:l.x,y:l.y},this.originalScale={x:l.scale.x,y:l.scale.y},this.targetPosition=t||{x:this.centerPosition.x,y:this.centerPosition.y},this.targetScale=i||this.defaultScale,!a)return l.position.set(this.targetPosition.x,this.targetPosition.y),l.scale.set(this.targetScale.x,this.targetScale.y),this.antiScale(this.targetScale.x),void(null!==this.transitionStartTime&&(r.ticker.remove(this.boundResetAnimation),this.transitionStartTime=null));var c,u,d;const p=.8*(c=Math.sqrt((l.x-this.targetPosition.x)**2+(l.y-this.targetPosition.y)**2),Math.pow(Math.min(1,c/1e3),.5))+.2*(u=l.scale.x,d=this.targetScale.x,Math.pow(Math.min(1,Math.abs(u-d)/Math.abs(-.8)),.5));this.transitionDuration=500+1e3*Math.min(1,Math.pow(p,2)),null!==this.transitionStartTime&&(r.ticker.remove(this.boundResetAnimation),this.interactionState.isAnimating=!1,r.stopRender("animation")),this.interactionState.isAnimating=!0,r.requestRender("animation",!0),this.transitionStartTime=r.ticker.lastTime,r.ticker.add(this.boundResetAnimation)}clearTouches(){const t=o().getApp();this.activeTouches.clear(),this.firstTouchId=null,this.secondTouchId=null,this.dragStart=null,this.initialTouchDistance=null,this.initialScale=null,this.initialPinchCenter=null,this.isGestureValid=!0,null!==this.transitionStartTime&&(t.ticker.remove(this.boundResetAnimation),this.transitionStartTime=null),this.interactionState.isInteracting=!1,t.stopRender("interaction")}checkEventListeners(){return{wheel:this.listenerCount("wheel"),pointerdown:this.listenerCount("pointerdown"),pointerup:this.listenerCount("pointerup"),pointerupoutside:this.listenerCount("pointerupoutside"),pointermove:this.listenerCount("pointermove")}}destroy(){this.checkEventListeners(),this.interactionState.interactionTimer&&clearTimeout(this.interactionState.interactionTimer),this.interactionState.renderReasons.clear(),this.interactionState.isInteracting=!1,this.interactionState.isAnimating=!1,this.debouncedStopWheelRender.cancel(),o().emitter.off("gestureHijackStart",this.handleGestureHijacked),super.destroy()}handleGestureHijacked=t=>{this.isGestureHijacked=!0,this.hijackedPointerId=t.pointerId,this.isHijackPaused=!1,this.clearTouches(),this.activeTouches.set(t.pointerId,{x:t.global.x,y:t.global.y}),this.firstTouchId=t.pointerId,this.dragStart={x:t.global.x,y:t.global.y}};exitGestureHijacked(){null===this.hijackedPointerId||this.isHijackPaused||(this.activeTouches.delete(this.hijackedPointerId),this.firstTouchId===this.hijackedPointerId&&(this.firstTouchId=null,this.dragStart=null),this.secondTouchId===this.hijackedPointerId&&(this.secondTouchId=null)),this.isGestureHijacked=!1,this.hijackedPointerId=null,this.isHijackPaused=!1}pauseGestureHijack(){this.isHijackPaused=!0}resumeGestureHijack(){this.isHijackPaused=!1}antiScale(t){o().emitter.emit("antiScale",t)}resetAnimation(){const t=o(),i=t.getApp(),s=t.appContainer;if(null===this.transitionStartTime)return;const{targetPosition:n,targetScale:a}=this,h=i.ticker.lastTime,r=Math.min(1,(h-this.transitionStartTime)/this.transitionDuration);if(r>=1)s.position.set(n.x,n.y),s.scale.set(a.x,a.y),this.antiScale(a.x),i.ticker.remove(this.boundResetAnimation),this.transitionStartTime=null,this.interactionState.isAnimating=!1,i.stopRender("animation");else{const t=e(r),i=this.originalPosition.x+(n.x-this.originalPosition.x)*t,o=this.originalPosition.y+(n.y-this.originalPosition.y)*t,h=this.originalScale.x+(a.x-this.originalScale.x)*t,l=this.originalScale.y+(a.y-this.originalScale.y)*t;s.position.set(i,o),s.scale.set(h,l),this.antiScale(h)}}onWheel(t){const i=o();if(this.isGestureHijacked)return void n.warn("⚠️ [onWheel] 被手势劫持阻止执行",{isGestureHijacked:this.isGestureHijacked,hijackedPointerId:this.hijackedPointerId,isHijackPaused:this.isHijackPaused});i.getApp().requestRender("wheel",!0),this.debouncedStopWheelRender();const{scaleMin:e,scaleMax:s}=this,a=i.appContainer;t.preventDefault();const h=t.clientX,r=t.clientY,l=(h-a.x)/a.scale.x,c=(r-a.y)/a.scale.y,u=t.deltaY>0?.95:1.05;let d=a.scale.x*u,p=a.scale.y*u;if(d=Math.max(e,Math.min(s,d)),p=Math.max(e,Math.min(s,p)),d===a.scale.x&&p===a.scale.y)return;const x=h-l*d,m=r-c*p;try{a.scale.set(d,p),a.position.set(x,m),this.antiScale(d)}catch(t){n.error("❌ [onWheel] 应用缩放时发生错误:",t)}}onPointerDown(t){const i=o();this.interactionState.isInteracting=!0,i.getApp().requestRender("interaction",!0),this.isGestureHijacked&&(t.pointerId===this.hijackedPointerId||this.isHijackPaused||this.pauseGestureHijack());const e=i.getApp(),s=i.appContainer;if(null!==this.transitionStartTime&&(e.ticker.remove(this.boundResetAnimation),this.transitionStartTime=null),this.activeTouches.has(t.pointerId-2)&&this.activeTouches.delete(t.pointerId-2),0===this.activeTouches.size&&(this.isGestureValid=!0,this.initialTouchDistance=null,this.initialScale=null,this.initialPinchCenter=null,this.dragStart=null,this.firstTouchId=null,this.secondTouchId=null),this.activeTouches.has(t.pointerId)&&1===this.activeTouches.size&&(this.isGestureValid=!0),this.activeTouches.set(t.pointerId,{x:t.global.x,y:t.global.y}),1===this.activeTouches.size)this.firstTouchId=t.pointerId,this.dragStart={x:t.global.x,y:t.global.y};else if(2===this.activeTouches.size){const i=Array.from(this.activeTouches.keys());this.secondTouchId=i.find(t=>t!==this.firstTouchId)||t.pointerId,this.setInitialScaleAndDistance(s),this.tapDetectionEnabled=!1}}onPointerUp(t){const i=o();if(this.isGestureHijacked){if(t.pointerId===this.hijackedPointerId)return i.emitter.emit("gestureHijackPointerUp",t),void this.exitGestureHijacked();this.isHijackPaused}if(!this.activeTouches.has(t.pointerId))return;const e=null!==this.initialTouchDistance&&null!==this.initialScale;this.activeTouches.delete(t.pointerId),e&&1===this.activeTouches.size&&(this.isGestureValid=!1,this.initialTouchDistance=null,this.initialScale=null,this.initialPinchCenter=null),t.pointerId===this.firstTouchId?(this.firstTouchId=null,this.dragStart=null,0===this.activeTouches.size&&this.tapDetectionEnabled&&this.detectDoubleTap(t)):t.pointerId===this.secondTouchId&&(this.secondTouchId=null),this.isGestureHijacked&&this.isHijackPaused&&1===this.activeTouches.size&&Array.from(this.activeTouches.keys())[0]===this.hijackedPointerId&&this.resumeGestureHijack(),0===this.activeTouches.size&&(this.isGestureValid=!0,this.initialTouchDistance=null,this.initialScale=null,this.initialPinchCenter=null,this.firstTouchId=null,this.secondTouchId=null,this.dragStart=null,this.tapDetectionEnabled=!0,this.interactionState.isInteracting=!1,i.getApp().stopRender("interaction"))}detectDoubleTap(t){const i=o(),{interactionConfig:e}=i;if(!e.enableDoubleTapZoom)return;const n=performance.now(),a={x:t.global.x,y:t.global.y};n-this.lastTapTime<this.doubleTapDelay&&this.lastTapPosition&&s(a,this.lastTapPosition)<this.tapDistanceThreshold?(this.handleDoubleTap(a),this.lastTapTime=0,this.lastTapPosition=null):(this.lastTapTime=n,this.lastTapPosition=a)}handleDoubleTap(t){const i=o(),e=i.getApp(),s=i.appContainer,{scaleMin:n,scaleMax:a,doubleTapZoomFactor:h}=this,r=t.x,l=t.y,c=(r-s.x)/s.scale.x,u=(l-s.y)/s.scale.y;let d=s.scale.x*h,p=s.scale.y*h;d=Math.max(n,Math.min(a,d)),p=Math.max(n,Math.min(a,p)),this.originalPosition={x:s.x,y:s.y},this.originalScale={x:s.scale.x,y:s.scale.y};const x=r-c*d,m=l-u*p;this.targetPosition={x:x,y:m},this.targetScale={x:d,y:p},this.interactionState.isAnimating=!0,e.requestRender("animation",!0),this.transitionDuration=300,this.transitionStartTime=e.ticker.lastTime,e.ticker.add(this.boundResetAnimation)}onPointerMove(t){if(this.isGestureHijacked&&!this.isHijackPaused)return t.pointerId===this.hijackedPointerId?(this.activeTouches.set(t.pointerId,{x:t.global.x,y:t.global.y}),void o().emitter.emit("gestureHijackPointerMove",t)):void 0;this.activeTouches.has(t.pointerId)&&this.isGestureValid&&(this.activeTouches.set(t.pointerId,{x:t.global.x,y:t.global.y}),2===this.activeTouches.size&&null!==this.initialTouchDistance&&null!==this.initialScale&&this.applyPinchZoom(),1!==this.activeTouches.size||null===this.initialTouchDistance&&null===this.initialScale||(this.initialTouchDistance=null,this.initialScale=null,this.initialPinchCenter=null,this.secondTouchId=null),1===this.activeTouches.size&&t.pointerId===this.firstTouchId&&null!==this.dragStart&&this.applyPan(t))}applyPan(t){const i=o(),e=this.activeTouches.get(t.pointerId),s=i.appContainer,{x:n,y:a}=this.dragStart;s.position.set(s.x+e.x-n,s.y+e.y-a),this.dragStart={x:e.x,y:e.y}}applyPinchZoom(){const t=o().appContainer,i=Array.from(this.activeTouches.values());if(i.length<2||!this.initialTouchDistance||!this.initialScale||!this.initialPinchCenter)return;const e=s(i[0],i[1]),n={x:(i[0].x+i[1].x)/2,y:(i[0].y+i[1].y)/2},a=(n.x-t.position.x)/t.scale.x,h=(n.y-t.position.y)/t.scale.y,r=(e/this.initialTouchDistance)**this.zoomFactor,l=Math.max(this.scaleMin,Math.min(this.scaleMax,this.initialScale.x*r)),c=Math.max(this.scaleMin,Math.min(this.scaleMax,this.initialScale.y*r));t.scale.set(l,c);let u=n.x-a*l,d=n.y-h*c;u+=n.x-this.initialPinchCenter.x,d+=n.y-this.initialPinchCenter.y,t.position.set(u,d),this.antiScale(l),this.initialPinchCenter=n}setInitialScaleAndDistance(t){const i=Array.from(this.activeTouches.values());i.length<2||(this.initialTouchDistance=s(i[0],i[1]),this.initialScale={x:t.scale.x,y:t.scale.y},this.initialPinchCenter={x:(i[0].x+i[1].x)/2,y:(i[0].y+i[1].y)/2})}}export{h as Interaction};
1
+ import{Container as t,Graphics as i}from"pixi.js";import{easeInOutCubic as e}from"../utils/index.js";import{getDistance as s}from"../utils/algorithm.js";import{Logger as n}from"../utils/logger.js";import{throttle as a,debounce as o}from"lodash-es";import{useAppService as h}from"./AppService.js";class r extends t{dragStart=null;initialTouchDistance=null;initialScale=null;activeTouches=new Map;firstTouchId=null;secondTouchId=null;zoomFactor=.8;scaleMin=.2;scaleMax=5;originalPosition={x:0,y:0};targetPosition={x:0,y:0};centerPosition={x:0,y:0};originalScale={x:1,y:1};targetScale={x:1,y:1};defaultScale={x:1,y:1};transitionDuration=500;transitionStartTime=null;initialPinchCenter=null;isGestureValid=!0;lastTapTime=0;doubleTapDelay=300;doubleTapZoomFactor=1.5;lastTapPosition=null;tapDistanceThreshold=20;tapDetectionEnabled=!0;isGestureHijacked=!1;hijackedPointerId=null;isHijackPaused=!1;interactionGraphics;viewportBounds;boundResetAnimation;debouncedStopWheelRender;interactionState={isInteracting:!1,isAnimating:!1,interactionTimer:null,renderReasons:new Set};throttledAntiScale;constructor(){super();const t=h().getApp();this.viewportBounds=t.getViewportBounds(),this.eventMode="static",this.interactionGraphics=new i,this.interactionGraphics.rect(this.viewportBounds.x,this.viewportBounds.y,this.viewportBounds.width,this.viewportBounds.height).fill({color:"#ffffff",alpha:0}),this.addChild(this.interactionGraphics),this.scaleMax=t.scaleMax,this.scaleMin=t.scaleMin,this.centerPosition={x:Math.round(this.viewportBounds.x+this.viewportBounds.width/2),y:Math.round(this.viewportBounds.y+this.viewportBounds.height/2)},this.originalPosition={x:Math.round(this.viewportBounds.width/2),y:Math.round(this.viewportBounds.height/2)},this.targetPosition={x:Math.round(this.viewportBounds.width/2),y:Math.round(this.viewportBounds.height/2)},this.throttledAntiScale=a(t=>{h().emitter.emit("antiScale",t)},16,{leading:!0,trailing:!0}),this.boundResetAnimation=this.resetAnimation.bind(this),this.debouncedStopWheelRender=o(()=>{t.stopRender("wheel")},300),this.setupInteraction()}setupInteraction(){this.on("pointerdown",t=>this.onPointerDown(t)),this.on("pointerup",t=>this.onPointerUp(t)),this.on("pointerupoutside",t=>this.onPointerUp(t)),this.on("pointermove",t=>this.onPointerMove(t)),this.on("wheel",t=>this.onWheel(t)),h().emitter.on("gestureHijackStart",this.handleGestureHijacked),document.addEventListener("pointercancel",()=>{this.clearTouches()})}resetPan(t){const i=h(),e=i.getApp(),s=i.appContainer;null!==this.transitionStartTime&&(e.ticker.remove(this.boundResetAnimation),this.transitionStartTime=null);const n=this.centerPosition.x-t.x*s.scale.x,a=this.centerPosition.y-t.y*s.scale.y;this.originalPosition={x:s.x,y:s.y},this.targetPosition={x:n,y:a},this.originalScale={x:s.scale.x,y:s.scale.y},this.targetScale={x:s.scale.x,y:s.scale.y};const o=(r=Math.sqrt((s.x-n)**2+(s.y-a)**2),Math.pow(Math.min(1,r/1e3),.5));var r;this.transitionDuration=500+1e3*Math.min(1,Math.pow(o,2)),this.transitionStartTime=e.ticker.lastTime,e.ticker.add(this.boundResetAnimation)}setPanZoom({targetPosition:t,targetScale:i,setCenter:e=!1,setScale:s=!1}={},a=!0){const o=h(),r=o.getApp(),l=o.appContainer;if(e&&t&&(this.centerPosition={x:t.x,y:t.y},n.debug("[Interaction] Set center position:",this.centerPosition)),s&&i&&(this.defaultScale={x:i.x,y:i.y},this.scaleMin=i.x*r.scaleMin,this.scaleMax=i.x*r.scaleMax,n.debug("[Interaction] Set scale:",this.defaultScale)),this.originalPosition={x:l.x,y:l.y},this.originalScale={x:l.scale.x,y:l.scale.y},this.targetPosition=t||{x:this.centerPosition.x,y:this.centerPosition.y},this.targetScale=i||this.defaultScale,!a)return l.position.set(this.targetPosition.x,this.targetPosition.y),l.scale.set(this.targetScale.x,this.targetScale.y),this.antiScale(this.targetScale.x),void(null!==this.transitionStartTime&&(r.ticker.remove(this.boundResetAnimation),this.transitionStartTime=null));var c,u,d;const p=.8*(c=Math.sqrt((l.x-this.targetPosition.x)**2+(l.y-this.targetPosition.y)**2),Math.pow(Math.min(1,c/1e3),.5))+.2*(u=l.scale.x,d=this.targetScale.x,Math.pow(Math.min(1,Math.abs(u-d)/Math.abs(-.8)),.5));this.transitionDuration=500+1e3*Math.min(1,Math.pow(p,2)),null!==this.transitionStartTime&&(r.ticker.remove(this.boundResetAnimation),this.interactionState.isAnimating=!1,r.stopRender("animation")),this.interactionState.isAnimating=!0,r.requestRender("animation",!0),this.transitionStartTime=r.ticker.lastTime,r.ticker.add(this.boundResetAnimation)}clearTouches(){const t=h().getApp();this.activeTouches.clear(),this.firstTouchId=null,this.secondTouchId=null,this.dragStart=null,this.initialTouchDistance=null,this.initialScale=null,this.initialPinchCenter=null,this.isGestureValid=!0,null!==this.transitionStartTime&&(t.ticker.remove(this.boundResetAnimation),this.transitionStartTime=null),this.interactionState.isInteracting=!1,t.stopRender("interaction")}checkEventListeners(){return{wheel:this.listenerCount("wheel"),pointerdown:this.listenerCount("pointerdown"),pointerup:this.listenerCount("pointerup"),pointerupoutside:this.listenerCount("pointerupoutside"),pointermove:this.listenerCount("pointermove")}}destroy(){this.checkEventListeners(),this.interactionState.interactionTimer&&clearTimeout(this.interactionState.interactionTimer),this.interactionState.renderReasons.clear(),this.interactionState.isInteracting=!1,this.interactionState.isAnimating=!1,this.debouncedStopWheelRender.cancel(),h().emitter.off("gestureHijackStart",this.handleGestureHijacked),super.destroy()}handleGestureHijacked=t=>{this.isGestureHijacked=!0,this.hijackedPointerId=t.pointerId,this.isHijackPaused=!1,this.clearTouches(),this.activeTouches.set(t.pointerId,{x:t.global.x,y:t.global.y}),this.firstTouchId=t.pointerId,this.dragStart={x:t.global.x,y:t.global.y}};exitGestureHijacked(){null===this.hijackedPointerId||this.isHijackPaused||(this.activeTouches.delete(this.hijackedPointerId),this.firstTouchId===this.hijackedPointerId&&(this.firstTouchId=null,this.dragStart=null),this.secondTouchId===this.hijackedPointerId&&(this.secondTouchId=null)),this.isGestureHijacked=!1,this.hijackedPointerId=null,this.isHijackPaused=!1}pauseGestureHijack(){this.isHijackPaused=!0}resumeGestureHijack(){this.isHijackPaused=!1}antiScale(t){this.throttledAntiScale(t)}resetAnimation(){const t=h(),i=t.getApp(),s=t.appContainer;if(null===this.transitionStartTime)return;const{targetPosition:n,targetScale:a}=this,o=i.ticker.lastTime,r=Math.min(1,(o-this.transitionStartTime)/this.transitionDuration);if(r>=1)s.position.set(n.x,n.y),s.scale.set(a.x,a.y),this.antiScale(a.x),i.ticker.remove(this.boundResetAnimation),this.transitionStartTime=null,this.interactionState.isAnimating=!1,i.stopRender("animation");else{const t=e(r),i=this.originalPosition.x+(n.x-this.originalPosition.x)*t,o=this.originalPosition.y+(n.y-this.originalPosition.y)*t,h=this.originalScale.x+(a.x-this.originalScale.x)*t,l=this.originalScale.y+(a.y-this.originalScale.y)*t;s.position.set(i,o),s.scale.set(h,l),this.antiScale(h)}}onWheel(t){const i=h();if(this.isGestureHijacked)return void n.warn("⚠️ [onWheel] 被手势劫持阻止执行",{isGestureHijacked:this.isGestureHijacked,hijackedPointerId:this.hijackedPointerId,isHijackPaused:this.isHijackPaused});i.getApp().requestRender("wheel",!0),this.debouncedStopWheelRender();const{scaleMin:e,scaleMax:s}=this,a=i.appContainer;t.preventDefault();const o=t.clientX,r=t.clientY,l=(o-a.x)/a.scale.x,c=(r-a.y)/a.scale.y,u=t.deltaY>0?.95:1.05;let d=a.scale.x*u,p=a.scale.y*u;if(d=Math.max(e,Math.min(s,d)),p=Math.max(e,Math.min(s,p)),d===a.scale.x&&p===a.scale.y)return;const x=o-l*d,m=r-c*p;try{a.scale.set(d,p),a.position.set(x,m),this.antiScale(d)}catch(t){n.error("❌ [onWheel] 应用缩放时发生错误:",t)}}onPointerDown(t){const i=h();this.interactionState.isInteracting=!0,i.getApp().requestRender("interaction",!0),this.isGestureHijacked&&(t.pointerId===this.hijackedPointerId||this.isHijackPaused||this.pauseGestureHijack());const e=i.getApp(),s=i.appContainer;if(null!==this.transitionStartTime&&(e.ticker.remove(this.boundResetAnimation),this.transitionStartTime=null),this.activeTouches.has(t.pointerId-2)&&this.activeTouches.delete(t.pointerId-2),0===this.activeTouches.size&&(this.isGestureValid=!0,this.initialTouchDistance=null,this.initialScale=null,this.initialPinchCenter=null,this.dragStart=null,this.firstTouchId=null,this.secondTouchId=null),this.activeTouches.has(t.pointerId)&&1===this.activeTouches.size&&(this.isGestureValid=!0),this.activeTouches.set(t.pointerId,{x:t.global.x,y:t.global.y}),1===this.activeTouches.size)this.firstTouchId=t.pointerId,this.dragStart={x:t.global.x,y:t.global.y};else if(2===this.activeTouches.size){const i=Array.from(this.activeTouches.keys());this.secondTouchId=i.find(t=>t!==this.firstTouchId)||t.pointerId,this.setInitialScaleAndDistance(s),this.tapDetectionEnabled=!1}}onPointerUp(t){const i=h();if(this.isGestureHijacked){if(t.pointerId===this.hijackedPointerId)return i.emitter.emit("gestureHijackPointerUp",t),void this.exitGestureHijacked();this.isHijackPaused}if(!this.activeTouches.has(t.pointerId))return;const e=null!==this.initialTouchDistance&&null!==this.initialScale;this.activeTouches.delete(t.pointerId),e&&1===this.activeTouches.size&&(this.isGestureValid=!1,this.initialTouchDistance=null,this.initialScale=null,this.initialPinchCenter=null),t.pointerId===this.firstTouchId?(this.firstTouchId=null,this.dragStart=null,0===this.activeTouches.size&&this.tapDetectionEnabled&&this.detectDoubleTap(t)):t.pointerId===this.secondTouchId&&(this.secondTouchId=null),this.isGestureHijacked&&this.isHijackPaused&&1===this.activeTouches.size&&Array.from(this.activeTouches.keys())[0]===this.hijackedPointerId&&this.resumeGestureHijack(),0===this.activeTouches.size&&(this.isGestureValid=!0,this.initialTouchDistance=null,this.initialScale=null,this.initialPinchCenter=null,this.firstTouchId=null,this.secondTouchId=null,this.dragStart=null,this.tapDetectionEnabled=!0,this.interactionState.isInteracting=!1,i.getApp().stopRender("interaction"))}detectDoubleTap(t){const i=h(),{interactionConfig:e}=i;if(!e.enableDoubleTapZoom)return;const n=performance.now(),a={x:t.global.x,y:t.global.y};n-this.lastTapTime<this.doubleTapDelay&&this.lastTapPosition&&s(a,this.lastTapPosition)<this.tapDistanceThreshold?(this.handleDoubleTap(a),this.lastTapTime=0,this.lastTapPosition=null):(this.lastTapTime=n,this.lastTapPosition=a)}handleDoubleTap(t){const i=h(),e=i.getApp(),s=i.appContainer,{scaleMin:n,scaleMax:a,doubleTapZoomFactor:o}=this,r=t.x,l=t.y,c=(r-s.x)/s.scale.x,u=(l-s.y)/s.scale.y;let d=s.scale.x*o,p=s.scale.y*o;d=Math.max(n,Math.min(a,d)),p=Math.max(n,Math.min(a,p)),this.originalPosition={x:s.x,y:s.y},this.originalScale={x:s.scale.x,y:s.scale.y};const x=r-c*d,m=l-u*p;this.targetPosition={x:x,y:m},this.targetScale={x:d,y:p},this.interactionState.isAnimating=!0,e.requestRender("animation",!0),this.transitionDuration=300,this.transitionStartTime=e.ticker.lastTime,e.ticker.add(this.boundResetAnimation)}onPointerMove(t){if(this.isGestureHijacked&&!this.isHijackPaused)return t.pointerId===this.hijackedPointerId?(this.activeTouches.set(t.pointerId,{x:t.global.x,y:t.global.y}),void h().emitter.emit("gestureHijackPointerMove",t)):void 0;this.activeTouches.has(t.pointerId)&&this.isGestureValid&&(this.activeTouches.set(t.pointerId,{x:t.global.x,y:t.global.y}),2===this.activeTouches.size&&null!==this.initialTouchDistance&&null!==this.initialScale&&this.applyPinchZoom(),1!==this.activeTouches.size||null===this.initialTouchDistance&&null===this.initialScale||(this.initialTouchDistance=null,this.initialScale=null,this.initialPinchCenter=null,this.secondTouchId=null),1===this.activeTouches.size&&t.pointerId===this.firstTouchId&&null!==this.dragStart&&this.applyPan(t))}applyPan(t){const i=h(),e=this.activeTouches.get(t.pointerId),s=i.appContainer,{x:n,y:a}=this.dragStart;s.position.set(s.x+e.x-n,s.y+e.y-a),this.dragStart={x:e.x,y:e.y}}applyPinchZoom(){const t=h().appContainer,i=Array.from(this.activeTouches.values());if(i.length<2||!this.initialTouchDistance||!this.initialScale||!this.initialPinchCenter)return;const e=s(i[0],i[1]),n={x:(i[0].x+i[1].x)/2,y:(i[0].y+i[1].y)/2},a=(n.x-t.position.x)/t.scale.x,o=(n.y-t.position.y)/t.scale.y,r=(e/this.initialTouchDistance)**this.zoomFactor,l=Math.max(this.scaleMin,Math.min(this.scaleMax,this.initialScale.x*r)),c=Math.max(this.scaleMin,Math.min(this.scaleMax,this.initialScale.y*r));t.scale.set(l,c);let u=n.x-a*l,d=n.y-o*c;u+=n.x-this.initialPinchCenter.x,d+=n.y-this.initialPinchCenter.y,t.position.set(u,d),this.antiScale(l),this.initialPinchCenter=n}setInitialScaleAndDistance(t){const i=Array.from(this.activeTouches.values());i.length<2||(this.initialTouchDistance=s(i[0],i[1]),this.initialScale={x:t.scale.x,y:t.scale.y},this.initialPinchCenter={x:(i[0].x+i[1].x)/2,y:(i[0].y+i[1].y)/2})}}export{r as Interaction};
@@ -1 +1 @@
1
- import{Graphics as t}from"pixi.js";import{useAppService as i}from"../../application/AppService.js";class e extends t{currentPosition=null;config;constructor(t){super(),this.setupAntiScaleListener(),this.config=t.config}setupAntiScaleListener(){i().emitter.on("antiScale",this.handleScaleChange.bind(this))}handleScaleChange=()=>{this.redraw()};draw(t){const e=i();this.currentPosition=t;const{ringSize:o,ringColor:r,ringStrokeWidth:s,ringStrokeColor:n,ringStrokeDashed:c,ringStrokeDashArray:a}=this.config;this.clear();const h=e.metersToPixels(o),l=e.getApp().toFixedSize(s);this.setFillStyle({color:r}),c&&a.length>=2?this.drawDashedCircle(t,h,n,l,a):this.circle(t.x,t.y,h).fill().stroke({color:n,width:l,cap:"round",join:"round"})}drawDashedCircle(t,e,o,r,s){const n=i();this.circle(t.x,t.y,e).fill();const c=n.getApp().toFixedSize(s[0]),a=n.getApp().toFixedSize(s[1]),h=2*Math.PI*e,l=c+a,d=Math.floor(h/l);if(0===d)return void this.circle(t.x,t.y,e).stroke({color:o,width:r,cap:"round",join:"round"});const p=h/d,g=p*(c/l);for(let i=0;i<d;i++){const o=i*p/e,r=(i*p+g)/e,s=Math.max(4,Math.ceil(Math.abs(r-o)*e/2)),n=(r-o)/s;for(let i=0;i<=s;i++){const r=o+n*i,s=t.x+e*Math.cos(r),c=t.y+e*Math.sin(r);0===i?this.moveTo(s,c):this.lineTo(s,c)}}this.stroke({color:o,width:r,cap:"round",join:"round"})}redraw(){this.currentPosition&&this.draw(this.currentPosition)}destroy(){i().emitter.off("antiScale",this.handleScaleChange),super.destroy()}}export{e as Ring};
1
+ import{Graphics as t}from"pixi.js";import{useAppService as i}from"../../application/AppService.js";class e extends t{currentPosition=null;config;constructor(t){super(),this.setupAntiScaleListener(),this.config=t.config}setupAntiScaleListener(){i().emitter.on("antiScale",this.handleScaleChange)}handleScaleChange=()=>{this.redraw()};draw(t){const e=i();this.currentPosition=t;const{ringSize:o,ringColor:r,ringStrokeWidth:s,ringStrokeColor:n,ringStrokeDashed:c,ringStrokeDashArray:a}=this.config;this.clear();const h=e.metersToPixels(o),l=e.getApp().toFixedSize(s);this.setFillStyle({color:r}),c&&a.length>=2?this.drawDashedCircle(t,h,n,l,a):this.circle(t.x,t.y,h).fill().stroke({color:n,width:l,cap:"round",join:"round"})}drawDashedCircle(t,e,o,r,s){const n=i();this.circle(t.x,t.y,e).fill();const c=n.getApp().toFixedSize(s[0]),a=n.getApp().toFixedSize(s[1]),h=2*Math.PI*e,l=c+a,d=Math.floor(h/l);if(0===d)return void this.circle(t.x,t.y,e).stroke({color:o,width:r,cap:"round",join:"round"});const p=h/d,g=p*(c/l);for(let i=0;i<d;i++){const o=i*p/e,r=(i*p+g)/e,s=Math.max(4,Math.ceil(Math.abs(r-o)*e/2)),n=(r-o)/s;for(let i=0;i<=s;i++){const r=o+n*i,s=t.x+e*Math.cos(r),c=t.y+e*Math.sin(r);0===i?this.moveTo(s,c):this.lineTo(s,c)}}this.stroke({color:o,width:r,cap:"round",join:"round"})}redraw(){this.currentPosition&&this.draw(this.currentPosition)}destroy(){i().emitter.off("antiScale",this.handleScaleChange),super.destroy()}}export{e as Ring};
@@ -1 +1 @@
1
- import{Graphics as t}from"pixi.js";import{LAYER_FREE as e}from"../../application/AppContainer.js";import{useAppService as o}from"../../application/AppService.js";class r extends t{constructor(){super();const t=o();t.appContainer.addToLayer(e,this),t.emitter.on("cacheAsTexture",t=>{this.cacheAsTexture(!1),this.cacheAsTexture({resolution:t})})}draw(t){const e=o();this.clear(),this.setFillStyle({color:e.mapConfig.freeColor});for(const e of t){const t=e.coordinates;for(let e=0;e<t.length;e+=2){const o=t[e],r=t[e+1];this.rect(o,r,1,1)}}this.fill(),this.updateCacheTexture()}}export{r as Free};
1
+ import{Graphics as e}from"pixi.js";import{LAYER_FREE as t}from"../../application/AppContainer.js";import{useAppService as r}from"../../application/AppService.js";class s extends e{cacheAsTextureHandler;constructor(){super();const e=r();e.appContainer.addToLayer(t,this),this.cacheAsTextureHandler=e=>{this.cacheAsTexture(!1),this.cacheAsTexture({resolution:e})},e.emitter.on("cacheAsTexture",this.cacheAsTextureHandler)}draw(e){const t=r();this.clear(),this.setFillStyle({color:t.mapConfig.freeColor});for(const t of e){const e=t.coordinates;for(let t=0;t<e.length;t+=2){const r=e[t],s=e[t+1];this.rect(r,s,1,1)}}this.fill(),this.updateCacheTexture()}destroy(e){r().emitter.off("cacheAsTexture",this.cacheAsTextureHandler),super.destroy(e)}}export{s as Free};
@@ -1 +1 @@
1
- import{Graphics as t}from"pixi.js";import{LAYER_OBSTACLE as o}from"../../application/AppContainer.js";import{RASTER_CHUNK_SIZE as e}from"../../constant/index.js";import{useAppService as s}from"../../application/AppService.js";class r extends t{constructor(){super();const t=s();t.appContainer.addToLayer(o,this),t.emitter.on("cacheAsTexture",t=>{this.cacheAsTexture(!1),this.cacheAsTexture({resolution:t})})}draw(t){const o=s();this.clear(),this.setFillStyle({color:o.mapConfig.obstacleColor});for(const o of t){const t=o.coordinates;for(let o=0;o<t.length;o+=2){const e=t[o],s=t[o+1];this.rect(e,s,1,1)}}this.fill(),this.updateCacheTexture()}drawRaster(t,o){const r=s();if(this.clear(),0!==t.length){this.setFillStyle({color:r.mapConfig.obstacleColor});for(let s=0;s<t.length;s+=e){const i=Math.min(s+e,t.length);for(let e=s;e<i;e++){const s=t[e],r=s%o,i=Math.floor(s/o);this.rect(r,i,1,1)}this.fill(),i<t.length&&this.setFillStyle({color:r.mapConfig.obstacleColor})}this.updateCacheTexture()}}}export{r as Obstacle};
1
+ import{Graphics as t}from"pixi.js";import{LAYER_OBSTACLE as e}from"../../application/AppContainer.js";import{RASTER_CHUNK_SIZE as o}from"../../constant/index.js";import{useAppService as r}from"../../application/AppService.js";class s extends t{cacheAsTextureHandler;constructor(){super();const t=r();t.appContainer.addToLayer(e,this),this.cacheAsTextureHandler=t=>{this.cacheAsTexture(!1),this.cacheAsTexture({resolution:t})},t.emitter.on("cacheAsTexture",this.cacheAsTextureHandler)}draw(t){const e=r();this.clear(),this.setFillStyle({color:e.mapConfig.obstacleColor});for(const e of t){const t=e.coordinates;for(let e=0;e<t.length;e+=2){const o=t[e],r=t[e+1];this.rect(o,r,1,1)}}this.fill(),this.updateCacheTexture()}drawRaster(t,e){const s=r();if(this.clear(),0!==t.length){this.setFillStyle({color:s.mapConfig.obstacleColor});for(let r=0;r<t.length;r+=o){const i=Math.min(r+o,t.length);for(let o=r;o<i;o++){const r=t[o],s=r%e,i=Math.floor(r/e);this.rect(s,i,1,1)}this.fill(),i<t.length&&this.setFillStyle({color:s.mapConfig.obstacleColor})}this.updateCacheTexture()}}destroy(t){r().emitter.off("cacheAsTexture",this.cacheAsTextureHandler),super.destroy(t)}}export{s as Obstacle};
package/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@ import { Container } from 'pixi.js';
7
7
  import { ControlsConfig as ControlsConfig_2 } from '..';
8
8
  import { ControlsManager as ControlsManager_2 } from '../managers/ControlsManager';
9
9
  import { CustomElementsManager as CustomElementsManager_2 } from '../managers/CustomElementsManager';
10
+ import { DestroyOptions } from 'pixi.js';
10
11
  import { DetectedObjectManager as DetectedObjectManager_2 } from '../managers/DetectedObjectManager';
11
12
  import { DividerConfig as DividerConfig_2 } from '..';
12
13
  import { Emitter } from 'mitt';
@@ -1416,6 +1417,7 @@ declare class EnhancedSprite extends Sprite {
1416
1417
  }
1417
1418
 
1418
1419
  declare class Free extends Graphics {
1420
+ private cacheAsTextureHandler;
1419
1421
  constructor();
1420
1422
  /**
1421
1423
  * 绘制结构化自由区域数据
@@ -1424,6 +1426,7 @@ declare class Free extends Graphics {
1424
1426
  draw(free: {
1425
1427
  coordinates: number[];
1426
1428
  }[]): void;
1429
+ destroy(options?: DestroyOptions | boolean): void;
1427
1430
  }
1428
1431
 
1429
1432
  /**
@@ -1641,6 +1644,7 @@ declare class Interaction extends Container {
1641
1644
  private boundResetAnimation;
1642
1645
  private debouncedStopWheelRender;
1643
1646
  private interactionState;
1647
+ private throttledAntiScale;
1644
1648
  constructor();
1645
1649
  setupInteraction(): void;
1646
1650
  resetPan(targetPosition: {
@@ -2600,7 +2604,7 @@ declare class MapManager {
2600
2604
  carpet: Carpet;
2601
2605
  chargingStation: ChargingStation;
2602
2606
  mapBounds: Bounds;
2603
- private hasAutoFitted;
2607
+ private lastMapId;
2604
2608
  private roomGeometryMap;
2605
2609
  private carpetData;
2606
2610
  private unsubscribeFns;
@@ -2686,6 +2690,7 @@ export declare type MapState = {
2686
2690
  }
2687
2691
 
2688
2692
  declare class Obstacle extends Graphics {
2693
+ private cacheAsTextureHandler;
2689
2694
  constructor();
2690
2695
  /**
2691
2696
  * 绘制结构化障碍物数据
@@ -2700,6 +2705,7 @@ declare class Obstacle extends Graphics {
2700
2705
  * @param width 地图宽度
2701
2706
  */
2702
2707
  drawRaster(obstacleIndices: Uint32Array, width: number): void;
2708
+ destroy(options?: DestroyOptions | boolean): void;
2703
2709
  }
2704
2710
 
2705
2711
  /**