Tune DAS timing and enable tapping

This commit is contained in:
2026-03-24 21:39:52 -07:00
parent 3a307dbc80
commit 35a90e9c78
+40 -6
View File
@@ -11,9 +11,17 @@ const keyState = {
ArrowDown: false, ArrowDown: false,
}; };
// Track key press timing for tap vs hold detection
let keyPressStartTime = null;
let wasAutoMoved = {
ArrowLeft: false,
ArrowRight: false,
ArrowDown: false,
};
let dasCounter = 0; let dasCounter = 0;
const DAS_DELAY = 100; // ms before auto-repeat starts const DAS_DELAY = 75; // ms before auto-repeat starts (reduced from 100 for faster response)
const ARR_SPEED = 30; // ms between auto-repeat moves const ARR_SPEED = 25; // ms between auto-repeat moves (reduced from 30 for faster movement)
// Initialize when DOM is ready // Initialize when DOM is ready
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
@@ -154,6 +162,8 @@ function setupKeyboardControls() {
// Track held keys for movement // Track held keys for movement
if (keyState.hasOwnProperty(e.key)) { if (keyState.hasOwnProperty(e.key)) {
keyState[e.key] = true; keyState[e.key] = true;
keyPressStartTime = performance.now(); // Track when key was pressed
wasAutoMoved[e.key] = false; // Reset auto-move flag for tap detection
dasCounter = 0; // Reset DAS counter when key pressed dasCounter = 0; // Reset DAS counter when key pressed
e.preventDefault(); e.preventDefault();
return; return;
@@ -186,6 +196,21 @@ function setupKeyboardControls() {
if (keyState.hasOwnProperty(e.key)) { if (keyState.hasOwnProperty(e.key)) {
keyState[e.key] = false; keyState[e.key] = false;
dasCounter = 0; dasCounter = 0;
// Tap detection: if key was held for less than DAS_DELAY and not auto-moved,
// send a single move for tap-based horizontal movement
if (keyPressStartTime) {
const pressDuration = performance.now() - keyPressStartTime;
if (pressDuration < DAS_DELAY && !wasAutoMoved[e.key]) {
// It was a tap - send single move
if (e.key === 'ArrowLeft') {
network.sendMove('left');
} else if (e.key === 'ArrowRight') {
network.sendMove('right');
}
}
}
keyPressStartTime = null;
} }
}); });
@@ -285,14 +310,23 @@ function gameLoop(currentTime) {
// Handle DAS (Delayed Auto Shift) for continuous movement // Handle DAS (Delayed Auto Shift) for continuous movement
if (!network.isSpectator && (keyState.ArrowLeft || keyState.ArrowRight || keyState.ArrowDown)) { if (!network.isSpectator && (keyState.ArrowLeft || keyState.ArrowRight || keyState.ArrowDown)) {
dasCounter += deltaTime; dasCounter += deltaTime;
// Send initial move immediately, then auto-repeat after DAS_DELAY // Send initial move immediately, then auto-repeat after DAS_DELAY
if (dasCounter >= DAS_DELAY) { if (dasCounter >= DAS_DELAY) {
const autoRepeatCounter = (dasCounter - DAS_DELAY) % ARR_SPEED; const autoRepeatCounter = (dasCounter - DAS_DELAY) % ARR_SPEED;
if (autoRepeatCounter < (deltaTime || 0)) { if (autoRepeatCounter < (deltaTime || 0)) {
if (keyState.ArrowLeft) network.sendMove('left'); if (keyState.ArrowLeft) {
if (keyState.ArrowRight) network.sendMove('right'); network.sendMove('left');
if (keyState.ArrowDown) network.sendDrop(); wasAutoMoved.ArrowLeft = true; // Mark as auto-moved so keyup doesn't send another
}
if (keyState.ArrowRight) {
network.sendMove('right');
wasAutoMoved.ArrowRight = true;
}
if (keyState.ArrowDown) {
network.sendDrop();
wasAutoMoved.ArrowDown = true;
}
} }
} }
} }