From 1f7928030197988fc7a822d6d505669223a0cb32 Mon Sep 17 00:00:00 2001 From: kron Date: Sat, 9 Aug 2025 12:19:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=9D=B6=E5=AD=90=E6=94=BE?= =?UTF-8?q?=E5=A4=A7=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/BowTargetEdit.vue | 208 ++++++++++++++++++++----------- src/pages/point-book-create.vue | 3 +- 2 files changed, 135 insertions(+), 76 deletions(-) diff --git a/src/components/BowTargetEdit.vue b/src/components/BowTargetEdit.vue index c7f93c8..1bea5e6 100644 --- a/src/components/BowTargetEdit.vue +++ b/src/components/BowTargetEdit.vue @@ -26,19 +26,40 @@ const arrow = ref(null); const isDragging = ref(false); const dragStartPos = ref({ x: 0, y: 0 }); const capsuleHeight = ref(0); +const scale = ref(1); +const zoomPos = ref({ x: 0, y: 0 }); +const targetPos = ref({ x: 0, y: 0 }); +let lastMoveTime = 0; // 点击靶纸创建新的点 const onClick = async (e) => { - if (arrow.value !== null || !props.onChange) return; + if ( + arrow.value !== null || + !props.onChange || + Date.now() - lastMoveTime < 300 + ) { + return; + } + const newArrow = { - x: e.detail.x, - y: e.detail.y - rect.value.top - capsuleHeight.value, + x: e.detail.x - zoomPos.value.x - 6 / scale.value, + y: + e.detail.y - + rect.value.top - + capsuleHeight.value - + zoomPos.value.y - + 6 / scale.value, + }; + + targetPos.value = { + x: zoomPos.value.x, + y: zoomPos.value.y, }; const side = rect.value.width; newArrow.ring = calcRing( props.id, - newArrow.x - rect.value.width * 0.05, - newArrow.y - 10, + newArrow.x / scale.value - rect.value.width * 0.05, + newArrow.y / scale.value - rect.value.width * 0.05, rect.value.width * 0.9, rect.value.width * 0.9 ); @@ -51,18 +72,27 @@ const onClick = async (e) => { // 确认添加箭矢 const confirmAdd = () => { - if (props.onChange) - props.onChange({ ...arrow.value, ring: arrow.value.ring || "M" }); + if (props.onChange) { + props.onChange({ + x: arrow.value.x / scale.value, + y: arrow.value.y / scale.value, + ring: arrow.value.ring || "M", + }); + } arrow.value = null; }; // 删除箭矢 const deleteArrow = () => { arrow.value = null; + targetPos.value = { + x: zoomPos.value.x, + y: zoomPos.value.y, + }; }; // 开始拖拽 - 同样修复坐标获取 -const startDrag = async (e, index) => { +const startDrag = async (e) => { if (!e.touches[0]) return; isDragging.value = true; dragStartPos.value = { @@ -73,27 +103,34 @@ const startDrag = async (e, index) => { // 拖拽移动 - 同样修复坐标获取 const onDrag = async (e) => { + lastMoveTime = Date.now(); if (!isDragging.value || !e.touches[0] || !arrow.value) return; - let clientX = e.touches[0].clientX; let clientY = e.touches[0].clientY; // 计算移动距离 const deltaX = clientX - dragStartPos.value.x; const deltaY = clientY - dragStartPos.value.y; - const side = rect.value.width; // 更新坐标 - arrow.value.x = Math.max(0, Math.min(side, arrow.value.x * side + deltaX)); - arrow.value.y = Math.max(0, Math.min(side, arrow.value.y * side + deltaY)); + arrow.value.x = Math.max( + 0, + Math.min(side * scale.value, arrow.value.x * side + deltaX) + ); + arrow.value.y = Math.max( + 0, + Math.min(side * scale.value, arrow.value.y * side + deltaY) + ); + arrow.value.ring = calcRing( props.id, - arrow.value.x - rect.value.width * 0.05, - arrow.value.y - 10, + arrow.value.x / scale.value - rect.value.width * 0.05, + arrow.value.y / scale.value - rect.value.width * 0.05, rect.value.width * 0.9, rect.value.width * 0.9 ); + arrow.value.x = arrow.value.x / side; arrow.value.y = arrow.value.y / side; @@ -102,17 +139,24 @@ const onDrag = async (e) => { }; // 结束拖拽 -const endDrag = () => { +const endDrag = (e) => { isDragging.value = false; }; - -const scale = ref(1); const onScale = (e) => { - scale.value = e.detail.scale; // 返回 1 ~ 2 + lastMoveTime = Date.now(); + const lastScale = scale.value; + scale.value = e.detail.scale; + zoomPos.value = { x: e.detail.x, y: e.detail.y }; + if (arrow.value) { + arrow.value.x = arrow.value.x * (scale.value / lastScale); + arrow.value.y = arrow.value.y * (scale.value / lastScale); + } }; const onMove = (e) => { - console.log(e); + if (e.detail.source) { + zoomPos.value = { x: e.detail.x, y: e.detail.y }; + } }; onMounted(async () => { @@ -126,7 +170,7 @@ onMounted(async () => {