Typescript 如果在一定距离内,将小部件并排捕捉

Typescript 如果在一定距离内,将小部件并排捕捉,typescript,Typescript,我目前正在设计一个房间计划者,遇到了一个让我头疼的问题。作为其中的一部分,我正在尝试实现Snapler功能。这将使生成的小部件立即向上靠近边缘,并且当移动的小部件在一定距离内时,它将捕捉,以便其位置位于最近的小部件旁边,并相应地旋转 我一直在玩这个,目前我的方法如下: function moveSelectedWidget(world: World, mousePosition: Point2): void { const selectedId = getSelectedWidget(w

我目前正在设计一个房间计划者,遇到了一个让我头疼的问题。作为其中的一部分,我正在尝试实现Snapler功能。这将使生成的小部件立即向上靠近边缘,并且当移动的小部件在一定距离内时,它将捕捉,以便其位置位于最近的小部件旁边,并相应地旋转

我一直在玩这个,目前我的方法如下:

function moveSelectedWidget(world: World, mousePosition: Point2): void {
    const selectedId = getSelectedWidget(world);

    if (world.getResource(ResourceId.MouseDown)!.down && !isNaN(selectedId)) {
        const bounds = world.getComponent(selectedId, ComponentId.BoundingBox)!;
        const isClicked = AxisAlignedBoundingBox.containsPointInXZ(bounds, mousePosition);

        if (isClicked) {
            clearAllStateIndexes(world);

            const position = world.getComponent(selectedId, ComponentId.Position)!;
            let snapped = false;

            for (const [_, [boundingBox, position2, rotation, dimensions]] of Array.from(world.query(SNAP_QUERY))) {
                if(_ !== selectedId) {
                const distance = Math.sqrt((position.x - position2.x)**2 + (position.z-position2.z)**2);
                console.log(distance)
                    
                    const distance2 = distance - dimensions.width * 2;

                    if(distance2 < 50 ) {
                         snapped = true;
                         position.x = position2.x + 50;
                         position.z = position2.z;
                    }
                }
            }

            if(!snapped) {
                position.x = mousePosition.x;
                position.z = mousePosition.z;
            }
        }
    }
}
函数moveSelectedWidget(世界:世界,鼠标位置:点2):无效{
const selectedId=getSelectedWidget(世界);
if(world.getResource(ResourceId.MouseDown)!.down&&!isNaN(selectedId)){
const bounds=world.getComponent(selectedId,ComponentId.BoundingBox)!;
const isClicked=AxisAlignedBoundingBox.containsPostinXz(边界,鼠标位置);
如果(已单击){
clearAllStateIndexes(世界);
const position=world.getComponent(selectedId,ComponentId.position)!;
让我们抓紧=假;
对于(world.query(SNAP_查询))的数组.from的(常量[0;,[boundingBox,position2,rotation,dimensions]]{
如果(!==selectedId){
常数距离=数学sqrt((位置x-位置2.x)**2+(位置z-位置2.z)**2);
控制台日志(距离)
常量距离2=距离-尺寸。宽度*2;
如果(距离2<50){
捕捉=真实;
位置.x=位置2.x+50;
位置z=位置2.z;
}
}
}
如果(!折断){
position.x=mousePosition.x;
position.z=mousePosition.z;
}
}
}
}
为了清晰起见,我包括了整个移动小部件功能,但捕捉部分是:

        let snapped = false;

        for (const [_, [boundingBox, position2, rotation, dimensions]] of Array.from(world.query(SNAP_QUERY))) {
            if(_ !== selectedId) {
            const distance = Math.sqrt((position.x - position2.x)**2 + (position.z-position2.z)**2);
            console.log(distance)
                
                const distance2 = distance - dimensions.width * 2;

                if(distance2 < 50 ) {
                     snapped = true;
                     position.x = position2.x + 50;
                     position.z = position2.z;
                }
            }
        }

        if(!snapped) {
            position.x = mousePosition.x;
            position.z = mousePosition.z;
        }
let snaped=false;
对于(world.query(SNAP_查询))的数组.from的(常量[0;,[boundingBox,position2,rotation,dimensions]]{
如果(!==selectedId){
常数距离=数学sqrt((位置x-位置2.x)**2+(位置z-位置2.z)**2);
控制台日志(距离)
常量距离2=距离-尺寸。宽度*2;
如果(距离2<50){
捕捉=真实;
位置.x=位置2.x+50;
位置z=位置2.z;
}
}
}
如果(!折断){
position.x=mousePosition.x;
position.z=mousePosition.z;
}
这是一种工作,只要移动的小部件在指定的距离内,它就会捕捉到该位置。然而,我遇到的问题是,现在的条件:f(distance2<50){将始终为真,并且小部件不再是可移动的,这显然不是很好,因为用户可能希望更改其位置

我怎样才能在这个条件下建立,使这不再是一个问题?某种键盘事件会有帮助吗