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.

ilyacolton
Messages : 1
Enregistré le : 30 sept. 2026, 08:40

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

Message par ilyacolton » 30 sept. 2026, 08:43

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`. fnaf
Est-ce que quelqu'un voit ce qui pourrait provoquer ce comportement?
Je développe un petit jeu JavaScript où un personnage se déplace sur une grille. Je rencontre un problème assez étrange : après plusieurs déplacements rapides et consécutifs, le personnage peut se figer pendant quelques secondes, même si les frappes au clavier sont toujours enregistrées par le système.

muralnatural
Messages : 1
Enregistré le : Hier, 05:12

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

Message par muralnatural » Hier, 05:13

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;
[size=1][url=https://spidersolitaire-2suits.com]Spider Solitaire 2 Suits[/url][/size]
        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?
Oui, je pense que le setTimeout peut rendre le comportement un peu imprévisible avec requestAnimationFrame. Un compteur basé sur le temps écoulé dans la boucle serait probablement plus fiable.

Répondre