因此,我将按钮输入从交换机发送到我的 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 表示“打开”,0 表示“关闭”。二进制数 5 为 101,因此从右向左读取表示第一个值 (A) 为“on”,第二个值 (B) 为“off”,第三个值 (X) 为“on”。
类似地,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>
我几乎复制了你的方法,但你也可以做一些事情,比如只获取“on”按钮:
// 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);
我确信有很多更时髦的方法来实现它,但是你必须保持它的可维护性,这取决于你想要的结果,这样你就可以将它用于其他任何事情。
关于javascript - KeysPressed 是位掩码的。如何取消位掩码并将其放入关键状态的结构中? (Javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61202235/