Mon personnage se bloque après plusieurs déplacements rapides

Pour toutes les discussions javascript, jQuery et autres frameworks
Répondre
lucassinner
Messages : 4
Enregistré le : 15 juil. 2025, 13:08

Mon personnage se bloque après plusieurs déplacements rapides

Message par lucassinner » 12 sept. 2026, 10:43

Bonjour,
Je travaille sur un petit jeu en JavaScript avec un personnage qui se déplace sur une grille. J'ai un problème assez étrange: après plusieurs déplacements rapides, le personnage peut rester bloqué pendant quelques secondes. Les touches sont pourtant toujours détectées.
Voici la partie du code qui gère le déplacement:

Code : Tout sélectionner

const player = {
    x: 2,
    y: 2,
    moving: false
};

const keys = {};

document.addEventListener("keydown", function(e) {
    keys[e.key] = true;
});

document.addEventListener("keyup", function(e) {
    keys[e.key] = false;
});

function movePlayer() {
    if (player.moving) return;

    let newX = player.x;
    let newY = player.y;

    if (keys["ArrowLeft"]) newX--;
    if (keys["ArrowRight"]) newX++;
    if (keys["ArrowUp"]) newY--;
    if (keys["ArrowDown"]) newY++;

    if (newX !== player.x || newY !== player.y) {
        player.moving = true;

        if (isBlocked(newX, newY)) {
            player.moving = false;
            return;
        }

        player.x = newX;
        player.y = newY;

        drawPlayer();

        setTimeout(function() {
            player.moving = false;
        }, 100);
    }
}

function gameLoop() {
    movePlayer();
    requestAnimationFrame(gameLoop);
}

gameLoop();
Je pense que le problème vient de `player.moving`, mais je ne comprends pas pourquoi il reste parfois bloqué alors que le `setTimeout` devrait remettre la valeur à `false`. Basketball Bros
Est-ce que quelqu'un voit ce qui pourrait provoquer ce comportement?

faultypolished
Messages : 3
Enregistré le : 03 févr. 2026, 10:33

Re: Mon personnage se bloque après plusieurs déplacements rapides

Message par faultypolished » 24 sept. 2026, 04:24

lucassinner a écrit : ↑
12 sept. 2026, 10:43
Bonjour,
Je travaille sur un petit jeu en JavaScript avec un personnage qui se déplace sur une grille. J'ai un problème assez étrange: après plusieurs déplacements rapides, le personnage peut rester bloqué pendant quelques secondes. Les touches sont pourtant toujours détectées.
Voici la partie du code qui gère le déplacement:

Code : Tout sélectionner

const player = {
    x: 2,
    y: 2,
    moving: false
};

const keys = {};

document.addEventListener("keydown", function(e) {
    keys[e.key] = true;
});

document.addEventListener("keyup", function(e) {
    keys[e.key] = false;
});

function movePlayer() {
    if (player.moving) return;

    let newX = player.x;
    let newY = player.y;

    if (keys["ArrowLeft"]) newX--;
    if (keys["ArrowRight"]) newX++;
    if (keys["ArrowUp"]) newY--;
    if (keys["ArrowDown"]) newY++;

    if (newX !== player.x || newY !== player.y) {
        player.moving = true;

        if (isBlocked(newX, newY)) {
            player.moving = false;
            return;
        }

        player.x = newX;
        player.y = newY;

        drawPlayer();

        setTimeout(function() {
            player.moving = false;
        }, 100);
    }
}

function gameLoop() {
    movePlayer();
    requestAnimationFrame(gameLoop);
}

gameLoop();
Je pense que le problème vient de `player.moving`, mais je ne comprends pas pourquoi il reste parfois bloqué alors que le `setTimeout` devrait remettre la valeur à `false`. Basketball Bros
Est-ce que quelqu'un voit ce qui pourrait provoquer ce comportement?
L'utilisation de `setTimeout` dans la boucle de jeu (`requestAnimationFrame spider solitaire free`) est une mauvaise pratique en programmation de jeux JavaScript, car le délai d'attente n'est pas synchronisé avec la fréquence de rafraîchissement de l'écran. Pour une fluidité optimale et sans latence, il est recommandé de gérer le temps de déplacement à l'aide du Delta Time ou d'un compteur d'images directement dans la boucle de jeu.

Répondre