111 lines
2.8 KiB
JavaScript
111 lines
2.8 KiB
JavaScript
// input.js : capture clavier + souris, envoi au serveur
|
|
|
|
import { send } from './network.js';
|
|
|
|
const moveKeys = { up: false, down: false, left: false, right: false };
|
|
|
|
let lastDx = 0, lastDy = 0;
|
|
let inputBlocked = false;
|
|
|
|
export function setInputBlocked(blocked) {
|
|
if (blocked && !inputBlocked) {
|
|
// on coupe le mouvement cote serveur si on bougeait, sinon le perso continue d avancer
|
|
if (lastDx !== 0 || lastDy !== 0) {
|
|
lastDx = 0; lastDy = 0;
|
|
send('input', { dx: 0, dy: 0 });
|
|
}
|
|
moveKeys.up = moveKeys.down = moveKeys.left = moveKeys.right = false;
|
|
}
|
|
inputBlocked = blocked;
|
|
}
|
|
|
|
export function isInputBlocked() { return inputBlocked; }
|
|
|
|
|
|
const MOVE_KEY_MAP = {
|
|
'z': 'up', 'ArrowUp': 'up',
|
|
's': 'down', 'ArrowDown': 'down',
|
|
'q': 'left', 'ArrowLeft': 'left',
|
|
'd': 'right', 'ArrowRight': 'right',
|
|
};
|
|
|
|
// AZERTY : on utilise e.code (Digit1) plutot que e.key (qui donne '&', 'é')
|
|
const ABILITY_CODE_MAP = { 'Digit1': 1, 'Digit2': 2 };
|
|
|
|
|
|
function computeDirection() {
|
|
let dx = 0, dy = 0;
|
|
if (moveKeys.left) dx -= 1;
|
|
if (moveKeys.right) dx += 1;
|
|
if (moveKeys.up) dy -= 1;
|
|
if (moveKeys.down) dy += 1;
|
|
|
|
// normaliser sinon la diagonale est plus rapide que les axes
|
|
if (dx !== 0 && dy !== 0) {
|
|
const inv = 1 / Math.SQRT2;
|
|
dx *= inv;
|
|
dy *= inv;
|
|
}
|
|
|
|
return { dx, dy };
|
|
}
|
|
|
|
|
|
function onKeyDown(e, getTarget) {
|
|
if (inputBlocked) return;
|
|
|
|
const moveAction = MOVE_KEY_MAP[e.key];
|
|
if (moveAction) {
|
|
e.preventDefault();
|
|
if (moveKeys[moveAction]) return;
|
|
moveKeys[moveAction] = true;
|
|
|
|
const { dx, dy } = computeDirection();
|
|
if (dx !== lastDx || dy !== lastDy) {
|
|
lastDx = dx; lastDy = dy;
|
|
send('input', { dx, dy });
|
|
}
|
|
return;
|
|
}
|
|
|
|
const abilityId = ABILITY_CODE_MAP[e.code];
|
|
if (abilityId) {
|
|
e.preventDefault();
|
|
const { wx, wy } = getTarget();
|
|
send('ability', { id: abilityId, tx: wx, ty: wy });
|
|
return;
|
|
}
|
|
|
|
if (e.key === 'e') {
|
|
e.preventDefault();
|
|
const { wx, wy } = getTarget();
|
|
send('displacement', { tx: wx, ty: wy });
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
function onKeyUp(e) {
|
|
if (inputBlocked) return;
|
|
|
|
const moveAction = MOVE_KEY_MAP[e.key];
|
|
if (!moveAction) return;
|
|
|
|
e.preventDefault();
|
|
if (!moveKeys[moveAction]) return;
|
|
|
|
moveKeys[moveAction] = false;
|
|
const { dx, dy } = computeDirection();
|
|
|
|
if (dx !== lastDx || dy !== lastDy) {
|
|
lastDx = dx; lastDy = dy;
|
|
send('input', { dx, dy });
|
|
}
|
|
}
|
|
|
|
|
|
export function startInputTracking(getTarget) {
|
|
document.addEventListener('keydown', e => onKeyDown(e, getTarget));
|
|
document.addEventListener('keyup', e => onKeyUp(e));
|
|
}
|