191 lines
6.2 KiB
JavaScript
Executable File
191 lines
6.2 KiB
JavaScript
Executable File
class GameControls {
|
|
constructor(game) {
|
|
this.game = game;
|
|
this.initControls();
|
|
this.initTouchControls();
|
|
}
|
|
|
|
initControls() {
|
|
// 重新开始按钮
|
|
document.getElementById('restartBtn').addEventListener('click', () => {
|
|
this.game.restart();
|
|
});
|
|
|
|
// 键盘快捷键
|
|
this.initKeyboardShortcuts();
|
|
}
|
|
|
|
initKeyboardShortcuts() {
|
|
document.addEventListener('keydown', (e) => {
|
|
switch(e.key) {
|
|
case 'r':
|
|
case 'R':
|
|
if (this.game.gameOver) {
|
|
this.game.restart();
|
|
}
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
|
|
initTouchControls() {
|
|
const canvas = document.getElementById('gameCanvas');
|
|
let isDragging = false;
|
|
let lastTouchX = 0;
|
|
let lastTouchY = 0;
|
|
let lastDirectionChange = 0;
|
|
const directionChangeDelay = 200; // 防止方向变化过快
|
|
|
|
// 触摸开始
|
|
canvas.addEventListener('touchstart', (e) => {
|
|
isDragging = true;
|
|
lastTouchX = e.touches[0].clientX;
|
|
lastTouchY = e.touches[0].clientY;
|
|
e.preventDefault();
|
|
}, { passive: false });
|
|
|
|
// 拖动过程中实时检测方向
|
|
canvas.addEventListener('touchmove', (e) => {
|
|
if (!isDragging) return;
|
|
|
|
const currentTime = Date.now();
|
|
if (currentTime - lastDirectionChange < directionChangeDelay) {
|
|
e.preventDefault();
|
|
return;
|
|
}
|
|
|
|
const currentTouchX = e.touches[0].clientX;
|
|
const currentTouchY = e.touches[0].clientY;
|
|
|
|
const deltaX = currentTouchX - lastTouchX;
|
|
const deltaY = currentTouchY - lastTouchY;
|
|
const minDragDistance = 20; // 最小拖动距离
|
|
|
|
// 检查是否达到最小拖动距离
|
|
if (Math.abs(deltaX) > minDragDistance || Math.abs(deltaY) > minDragDistance) {
|
|
if (Math.abs(deltaX) > Math.abs(deltaY)) {
|
|
// 水平拖动
|
|
if (deltaX > 0) {
|
|
this.game.changeDirection(1, 0); // 向右拖动
|
|
} else {
|
|
this.game.changeDirection(-1, 0); // 向左拖动
|
|
}
|
|
} else {
|
|
// 垂直拖动
|
|
if (deltaY > 0) {
|
|
this.game.changeDirection(0, 1); // 向下拖动
|
|
} else {
|
|
this.game.changeDirection(0, -1); // 向上拖动
|
|
}
|
|
}
|
|
|
|
// 更新最后触摸位置和方向变化时间
|
|
lastTouchX = currentTouchX;
|
|
lastTouchY = currentTouchY;
|
|
lastDirectionChange = currentTime;
|
|
|
|
// 添加触觉反馈
|
|
this.vibrate(30);
|
|
}
|
|
|
|
e.preventDefault();
|
|
}, { passive: false });
|
|
|
|
// 触摸结束
|
|
canvas.addEventListener('touchend', (e) => {
|
|
isDragging = false;
|
|
e.preventDefault();
|
|
}, { passive: false });
|
|
|
|
// 触摸取消
|
|
canvas.addEventListener('touchcancel', (e) => {
|
|
isDragging = false;
|
|
e.preventDefault();
|
|
}, { passive: false });
|
|
|
|
// 防止移动端页面滚动
|
|
document.addEventListener('touchmove', (e) => {
|
|
if (e.target.closest('.game-container')) {
|
|
e.preventDefault();
|
|
}
|
|
}, { passive: false });
|
|
|
|
// 添加鼠标拖动支持(用于桌面测试)
|
|
this.initMouseDragControls(canvas);
|
|
}
|
|
|
|
// 鼠标拖动控制(用于桌面测试)
|
|
initMouseDragControls(canvas) {
|
|
let isDragging = false;
|
|
let lastMouseX = 0;
|
|
let lastMouseY = 0;
|
|
let lastDirectionChange = 0;
|
|
const directionChangeDelay = 200;
|
|
|
|
canvas.addEventListener('mousedown', (e) => {
|
|
isDragging = true;
|
|
lastMouseX = e.clientX;
|
|
lastMouseY = e.clientY;
|
|
e.preventDefault();
|
|
});
|
|
|
|
canvas.addEventListener('mousemove', (e) => {
|
|
if (!isDragging) return;
|
|
|
|
const currentTime = Date.now();
|
|
if (currentTime - lastDirectionChange < directionChangeDelay) {
|
|
return;
|
|
}
|
|
|
|
const currentMouseX = e.clientX;
|
|
const currentMouseY = e.clientY;
|
|
|
|
const deltaX = currentMouseX - lastMouseX;
|
|
const deltaY = currentMouseY - lastMouseY;
|
|
const minDragDistance = 20;
|
|
|
|
if (Math.abs(deltaX) > minDragDistance || Math.abs(deltaY) > minDragDistance) {
|
|
if (Math.abs(deltaX) > Math.abs(deltaY)) {
|
|
if (deltaX > 0) {
|
|
this.game.changeDirection(1, 0); // 向右拖动
|
|
} else {
|
|
this.game.changeDirection(-1, 0); // 向左拖动
|
|
}
|
|
} else {
|
|
if (deltaY > 0) {
|
|
this.game.changeDirection(0, 1); // 向下拖动
|
|
} else {
|
|
this.game.changeDirection(0, -1); // 向上拖动
|
|
}
|
|
}
|
|
|
|
lastMouseX = currentMouseX;
|
|
lastMouseY = currentMouseY;
|
|
lastDirectionChange = currentTime;
|
|
}
|
|
});
|
|
|
|
canvas.addEventListener('mouseup', () => {
|
|
isDragging = false;
|
|
});
|
|
|
|
canvas.addEventListener('mouseleave', () => {
|
|
isDragging = false;
|
|
});
|
|
}
|
|
|
|
// 震动反馈(移动端)
|
|
vibrate(duration = 50) {
|
|
if ('vibrate' in navigator) {
|
|
navigator.vibrate(duration);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 初始化控制模块
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
// 等待游戏实例创建后初始化控制
|
|
setTimeout(() => {
|
|
new GameControls(game);
|
|
}, 100);
|
|
}); |