

@@ -698,7 +701,7 @@ const isPlayingSound = ref(false);
const drumsPosition = ref({ x: 20, y: 20 });
// 倒计时位置状态已移除,直接在模板中使用固定位置
// 奖金设置模块位置状态 - 使用reactive存储实际定位值
-const bonusPosition = reactive({ x: 'auto', y: 'auto' });
+const bonusPosition = reactive({ x: 320, y: 360 });
let isDragging = false;
let isBonusDragging = false;
@@ -731,12 +734,20 @@ const startDrag = (e) => {
const startBonusDrag = (e) => {
e.stopPropagation(); // 阻止事件冒泡
isBonusDragging = true;
- // 计算鼠标相对于元素左上角的偏移量
- const rect = e.currentTarget.getBoundingClientRect();
- bonusDragOffset.x = e.clientX - rect.left;
- bonusDragOffset.y = e.clientY - rect.top;
+
+ // 根据事件类型处理拖动偏移量
+ if (e.type === 'touchstart') {
+ const touch = e.touches[0];
+ bonusDragOffset.x = touch.clientX - bonusPosition.x;
+ bonusDragOffset.y = touch.clientY - bonusPosition.y;
+ } else {
+ bonusDragOffset.x = e.clientX - bonusPosition.x;
+ bonusDragOffset.y = e.clientY - bonusPosition.y;
+ }
+
// 提高拖动时的性能,临时禁用动画效果
- e.currentTarget.style.transition = 'none';
+ const bonusElement = e.currentTarget;
+ bonusElement.style.transition = 'none';
e.preventDefault();
};
@@ -761,9 +772,22 @@ const drag = throttle((e) => {
drumsPosition.value.y = e.clientY - dragOffset.y;
}
if (isBonusDragging) {
+ // 根据事件类型处理拖动位置
+ let clientX, clientY;
+ if (e.type === 'mousemove') {
+ clientX = e.clientX;
+ clientY = e.clientY;
+ } else if (e.type === 'touchmove') {
+ const touch = e.touches[0];
+ clientX = touch.clientX;
+ clientY = touch.clientY;
+ } else {
+ return; // 如果不是鼠标或触摸事件,直接返回
+ }
+
// 计算新的位置
- const newX = e.clientX - bonusDragOffset.x;
- const newY = e.clientY - bonusDragOffset.y;
+ const newX = clientX - bonusDragOffset.x;
+ const newY = clientY - bonusDragOffset.y;
// 确保元素不会被拖出视口
const windowWidth = window.innerWidth;
@@ -1012,7 +1036,8 @@ const startDrumAnimation = () => {
drum.style.setProperty('--drum-translate-y', isStrongBeat ?
`${(animationConfig.beatTranslateY || -15) * (1 + (patternConfig.accentAnimation || 0) / 100)}px` :
`${animationConfig.beatTranslateY || -15}px`);
- drum.style.setProperty('--drum-rotate', `${animationConfig.beatRotate || 5}deg`);
+ drum.style.setProperty('--drum-rotate', `${animationConfig.beatRotate || 5}deg`);
+
drum.style.setProperty('--drum-brightness', isStrongBeat ? '1.4' : '1.3');
drum.style.setProperty('--drum-saturation', isStrongBeat ? '1.3' : '1.2');
});
@@ -1091,6 +1116,8 @@ onMounted(async () => {
// 添加拖放相关的事件监听
document.addEventListener('mousemove', drag);
document.addEventListener('mouseup', endDrag);
+ document.addEventListener('touchmove', drag);
+ document.addEventListener('touchend', endDrag);
});
// 监听结束时间变化(在真实环境中,可能需要通过props或store来监听)
@@ -1115,6 +1142,8 @@ onUnmounted(() => {
// 移除拖放相关的事件监听
document.removeEventListener('mousemove', drag);
document.removeEventListener('mouseup', endDrag);
+ document.removeEventListener('touchmove', drag);
+ document.removeEventListener('touchend', endDrag);
// 清理音频资源
if (audioContext) {
@@ -1327,6 +1356,13 @@ onUnmounted(() => {
position: fixed;
cursor: move;
transition: transform 0.2s ease;
+ background: rgba(255, 255, 255, 0.95);
+ border-radius: 15px;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+
+ border: 2px solid rgba(255, 215, 0, 0.5);
+ padding: 15px;
+ z-index: 100;
}
/* 奖金图片容器样式 - Flex布局居中且保持一行 */
@@ -1342,14 +1378,13 @@ onUnmounted(() => {
.award-image {
width: auto;
height: 120px;
- /* border-radius: 8px; */
- /* box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); */
- /* transition: transform 0.2s ease, box-shadow 0.2s ease; */
+ border-radius: 8px;
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.award-image:hover {
transform: translateY(-5px);
- /* box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15); */
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);
}