因此,我将来自交换机的按钮输入发送到了我的node.js TCP服务器。
它是一个数字,但是当按下多个按钮时,它们会加在一起。
游戏杆位置不属于此数据集。
如何将KeysPressed改回键状态的结构?
最好在javascript中,因为我正在使用node.js
这是我的意思的一个例子
按钮编号如下。我确实注意到了这种模式,但是我不确定如何将其转换为javascript中的多个按键。
A = 1
B = 2
X = 4
Y = 8
LanalogPress = 16
RanalogPress = 32
L = 64
R = 128
ZL = 256
ZR = 512
+ = 1024
- = 2048
DpadL = 4096
DpadU = 8192
DpadRight = 16384
DpadDown = 32768
现在,如果我按下按钮,则说A和X,然后KeysPressed =5。因为1 + 4当然是5。
如果它的+和x为KeysPressed =1028。依此类推。
我从来没有遇到过这种类型的问题,很想学习为什么这样做,解决该问题的方法是什么。谷歌肯定不是一个容易的人
最佳答案
好像您有一个位掩码,其中1表示“ on”,0表示“ off”。二进制数5是101,因此从右到左读取意味着第一个值(A)为“开”,第二个值(B)为“关”,第三个值(X)为“开”。
同样,9为1001,因此A开启,B关闭,X关闭和Y开启。
按位右移运算符将舍弃该数字的最右位,并将所有内容向右移,因此5 >> 1
仅移位一位,因此101
变为10
或2。您可以遍历数字,将其移位一位进行时间测试奇数/偶数,以查看最后一位是1(奇数)还是0(偶数),直到用完所有位或遍历属性并将它们打开或关闭为止。
例如。
// Decode number n to state
function decodeMask(n) {
let props = ['A','B', 'X', 'Y', 'LanalogPress', 'RanalogPress', 'L', 'R', 'ZL', 'ZR', '+', '-', 'DpadL', 'DpadU', 'DpadRight', 'DpadDown'];
// Use empty object so no key clash. Note, doesn't have toString method!
let state = Object.create(null);
props.forEach((key, i) => state[key] = !!((n>>i) % 2));
return state;
}
// Stuff to play with decodeMask
function handleClick(evt) {
let inp = document.getElementById('inp0');
let res = document.getElementById('mask');
let state = document.getElementById('state');
let n = Number(inp.value);
let s = decodeMask(n);
res.textContent = n.toString(2).padStart(Object.keys(s).length,'0');
state.textContent = Object.keys(s).reduce((acc, key) => {
acc.push(key + ': ' + s[key]);
return acc;
},[]).join('\n');
}
window.onload = function() {
document.getElementById('btn0').addEventListener('click', handleClick, false);
}
// console.log(decodeMask(5));
<input id="inp0"> Enter number<br>
<button id="btn0">getState</button><br>
<div>Mask: <span id="mask"></span></div>
<pre id="state"></pre>
我已经复制了您的方法,但是您也可以执行一些操作,例如只需单击“打开”按钮即可:
// Return state object
let n = 9; // 1001
let props = ['A', 'B', 'X', 'Y']; // and so on
for (var state = {}, i = 0; n; i++) {
if (n % 2) state[props[i]] = 'on';
n = n >> 1;
}
console.log(state);
// Return just the "on" props
let v = 9; // 1001
let s = props.filter((prop, i) => (v >> i) % 2);
console.log(s);
我敢肯定有很多时髦的方法可以解决它,但是您必须保持它的可维护性,这取决于您想要的结果是什么,以便可以将其用于其他任何用途。