轻量级JavaScript键盘配置图
Lightweight JavaScript keyboard configuration map
我正在尝试为用户提供一种方法来为我正在开发的 JavaScript 游戏映射自定义键。我想我只是在这里遗漏了一些简单的东西,因为我看不到如何在不循环遍历每个键值的情况下完成这项工作(我想避免这种情况,因为我不想在提供灵活性的同时引入任何不必要的循环)。
基本上,有一个全局数组 keys
跟踪已按下的键,以便轻松地同时处理多个按键。
// keyboard lookup
// map movement keys to WASD, VI keys, and arrow keys
let keyboardConfig = {
'left': [37, 72, 65],
'right': [39, 76, 68],
'up': [38, 75, 87],
'down': [40, 74, 83],
'upleft': [89],
'upright': [85],
'downleft': [66],
'downright': [78]
}
和键盘处理程序:
// handle keyboard
let keys;
function handleKeys(e) {
keys = (keys || []);
keys[e.keyCode] = true;
let dirX = 0;
let dirY = 0;
let updateViz = false;
// TBD: replace keys[37] (etc.) with a more intelligent approach
if (keys[37]) { // left
dirX = -1;
updateViz = true;
}
if (keys[38]) { // up
dirY = -1;
updateViz = true;
}
if (keys[39]) { // right
dirX = 1;
updateViz = true;
}
if (keys[40]) { // down
dirY = 1;
updateViz = true;
}
if (updateViz) {
player.move(dirX, dirY);
camera.update();
}
}
基本上,我想避免对 keyboardConfig.left
中定义的每个 keyCode
执行类似 forEach
的操作。另一方面,我需要避免做类似 if keys[keyboardConfig.left[0]] || keys[keyboardConfig.left[1]] || keys[keyboardConfig.left[2]]
的事情,因为这显然不是很可扩展。
这是一般的想法,如果有需要检查的条件,您几乎总是希望地图定义它要做什么,然后将这些地图作为指令实现 - 这是一个开始:
document.onkeyup = handleKeys;
let elExample = document.getElementById("example");
// keyboard lookup
// map movement keys to WASD, VI keys, and arrow keys
let keyboardConfig = {
'left': [37, 72, 65],
'right': [39, 76, 68],
'up': [38, 75, 87],
'down': [40, 74, 83],
'upleft': [89],
'upright': [85],
'downleft': [66],
'downright': [78]
}
let movement = {
'left': -1,
'right': 1,
'up': -1,
'down': 1
}
let keyConfig = {};
for(let item in keyboardConfig){
for(let i in keyboardConfig[item]){
keyConfig[keyboardConfig[item][i]] = item;
}
}
// handle keyboard
let keys;
function handleKeys(e) {
console.log(e.keyCode)
keys = (keys || []);
keys[e.keyCode] = true;
if (keyConfig[e.keyCode]) {
console.log(keyConfig[e.keyCode], movement[keyConfig[e.keyCode]]);
elExample.innerHTML = keyConfig[e.keyCode] + " " + movement[keyConfig[e.keyCode]];
//player.move(movement[keyConfig[e.keyCode]] || 0, movement[keyConfig[e.keyCode]] || 0);
//camera.update();
}else{
elExample.innerHTML = "Not a tracked key";
}
}
<h4 id="example">type some stuff</h4>
我正在尝试为用户提供一种方法来为我正在开发的 JavaScript 游戏映射自定义键。我想我只是在这里遗漏了一些简单的东西,因为我看不到如何在不循环遍历每个键值的情况下完成这项工作(我想避免这种情况,因为我不想在提供灵活性的同时引入任何不必要的循环)。
基本上,有一个全局数组 keys
跟踪已按下的键,以便轻松地同时处理多个按键。
// keyboard lookup
// map movement keys to WASD, VI keys, and arrow keys
let keyboardConfig = {
'left': [37, 72, 65],
'right': [39, 76, 68],
'up': [38, 75, 87],
'down': [40, 74, 83],
'upleft': [89],
'upright': [85],
'downleft': [66],
'downright': [78]
}
和键盘处理程序:
// handle keyboard
let keys;
function handleKeys(e) {
keys = (keys || []);
keys[e.keyCode] = true;
let dirX = 0;
let dirY = 0;
let updateViz = false;
// TBD: replace keys[37] (etc.) with a more intelligent approach
if (keys[37]) { // left
dirX = -1;
updateViz = true;
}
if (keys[38]) { // up
dirY = -1;
updateViz = true;
}
if (keys[39]) { // right
dirX = 1;
updateViz = true;
}
if (keys[40]) { // down
dirY = 1;
updateViz = true;
}
if (updateViz) {
player.move(dirX, dirY);
camera.update();
}
}
基本上,我想避免对 keyboardConfig.left
中定义的每个 keyCode
执行类似 forEach
的操作。另一方面,我需要避免做类似 if keys[keyboardConfig.left[0]] || keys[keyboardConfig.left[1]] || keys[keyboardConfig.left[2]]
的事情,因为这显然不是很可扩展。
这是一般的想法,如果有需要检查的条件,您几乎总是希望地图定义它要做什么,然后将这些地图作为指令实现 - 这是一个开始:
document.onkeyup = handleKeys;
let elExample = document.getElementById("example");
// keyboard lookup
// map movement keys to WASD, VI keys, and arrow keys
let keyboardConfig = {
'left': [37, 72, 65],
'right': [39, 76, 68],
'up': [38, 75, 87],
'down': [40, 74, 83],
'upleft': [89],
'upright': [85],
'downleft': [66],
'downright': [78]
}
let movement = {
'left': -1,
'right': 1,
'up': -1,
'down': 1
}
let keyConfig = {};
for(let item in keyboardConfig){
for(let i in keyboardConfig[item]){
keyConfig[keyboardConfig[item][i]] = item;
}
}
// handle keyboard
let keys;
function handleKeys(e) {
console.log(e.keyCode)
keys = (keys || []);
keys[e.keyCode] = true;
if (keyConfig[e.keyCode]) {
console.log(keyConfig[e.keyCode], movement[keyConfig[e.keyCode]]);
elExample.innerHTML = keyConfig[e.keyCode] + " " + movement[keyConfig[e.keyCode]];
//player.move(movement[keyConfig[e.keyCode]] || 0, movement[keyConfig[e.keyCode]] || 0);
//camera.update();
}else{
elExample.innerHTML = "Not a tracked key";
}
}
<h4 id="example">type some stuff</h4>