Je réalise un jeu en utilisant canvas et javascript.
Lorsque la page est plus longue que l'écran (commentaires, etc.), une pression sur la flèche vers le bas la fait défiler vers le bas et rend le jeu impossible à lire.
Que puis-je faire pour empêcher la fenêtre de défiler lorsque le joueur veut simplement descendre?
J'imagine qu'avec Java jeux, etc.), ce n'est pas un problème tant que l'utilisateur clique sur le jeu.
J'ai essayé la solution de: Comment désactiver le défilement de page dans FF avec les touches fléchées , mais je n'ai pas réussi à le faire fonctionner.
Simplement empêcher la valeur par défaut action du navigateur:
window.addEventListener("keydown", function(e) {
// space and arrow keys
if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
e.preventDefault();
}
}, false);
J'ai utilisé la fonction suivante dans mon propre jeu:
var keys = {};
window.addEventListener("keydown",
function(e){
keys[e.keyCode] = true;
switch(e.keyCode){
case 37: case 39: case 38: case 40: // Arrow keys
case 32: e.preventDefault(); break; // Space
default: break; // do not block other keys
}
},
false);
window.addEventListener('keyup',
function(e){
keys[e.keyCode] = false;
},
false);
La magie se passe dans e.preventDefault();
. Ceci bloquera l'action par défaut de l'événement, dans ce cas, déplace le point de vue du navigateur.
Si vous n'avez pas besoin des états actuels du bouton, vous pouvez simplement déposer keys
et simplement annuler l'action par défaut sur les touches de direction:
var arrow_keys_handler = function(e) {
switch(e.keyCode){
case 37: case 39: case 38: case 40: // Arrow keys
case 32: e.preventDefault(); break; // Space
default: break; // do not block other keys
}
};
window.addEventListener("keydown", arrow_keys_handler, false);
Notez que cette approche vous permet également de supprimer le gestionnaire d'événements ultérieurement si vous devez réactiver le défilement par touches fléchées:
window.removeEventListener("keydown", arrow_keys_handler, false);
Pour la maintenabilité, j'attacherais le gestionnaire "bloquant" sur l'élément lui-même (dans votre cas, le canevas).
theCanvas.onkeydown = function (e) {
if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {
e.view.event.preventDefault();
}
}
Pourquoi ne pas simplement faire window.event.preventDefault()
? MDN déclare:
window.event
Est une propriété propriétaire de Microsoft Internet Explorer, disponible uniquement pendant l'appel d'un gestionnaire d'événements DOM. Sa valeur est l'objet Event en cours de traitement.
Lectures supplémentaires: