KeysPressed имеет битовую маску. Как мне снять битовую маску и превратить ее в структуру ключевых состояний? (Javascript) - PullRequest
0 голосов
/ 14 апреля 2020

Итак, я получаю кнопочные входы от коммутатора, отправленного на мой 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, конечно, пять.

Если его + и x, то это KeysPressed = 1028. И т. Д.

Я никогда не сталкивался с подобными проблемами и хотел бы узнайте, почему это сделано именно так и каково решение этой проблемы. Это не легко гуглить наверняка LOL

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Похоже, у вас есть битовая маска, где 1 "включены", а 0 "выключены". Число 5 в двоичном виде - 101, поэтому при чтении справа налево это означает, что первое значение (A) включено, второе значение (B) выключено, а третье значение (X) включено.

Аналогично 9 равно 1001, так что A включено, B выключено, X выключено и Y включено.

Оператор побитового сдвига вправо отбрасывает самый правый бит числа и сдвигает все вправо, поэтому 5 >> 1 сдвигается только один бит, поэтому 101 становится 10 или 2. Вы можете l oop по числу, сдвигая его по одному биту за раз и проверяя на нечетность / четность, чтобы определить, равен ли последний ди git 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));
 Enter number

Mask: 

Я в значительной степени скопировал ваш метод, но вы также можете делать такие вещи, как просто нажимать кнопки включения:

// 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);

Я уверен, что есть гораздо более забавные способы сделать это, но вы должны поддерживать его в обслуживании, и это зависит от того, что вы хотите, чтобы результат был таким Вы можете использовать его для чего-либо еще.

0 голосов
/ 14 апреля 2020

После игры с ним навсегда. Я наконец нашел решение.

Я смотрел на цифры некоторое время после того, как узнал, что они были замаскированы. Все еще не совсем уверен, правильно ли я отменил битовую маску. Или что я использую слово «право» ...

Но я заметил, что все числа входов, которые были правдой, были нечетными. Поэтому я только что проверил, странны ли они. Это работает отлично, даже если я не совсем понимаю, что я сделал ...

Если кто-то может объяснить, почему это сработало для меня, это было бы здорово XD

function isOdd(int) {
  return (int & 1) === 1;
}
function bitMaskToStruct(HeldKeys) {
  return {
    A: isOdd(HeldKeys >> 0),
    B: isOdd(HeldKeys >> 1),
    X: isOdd(HeldKeys >> 2),
    Y: isOdd(HeldKeys >> 3),
    LS: isOdd(HeldKeys >> 4),
    RS: isOdd(HeldKeys >> 5),
    L: isOdd(HeldKeys >> 6),
    R: isOdd(HeldKeys >> 7),
    ZL: isOdd(HeldKeys >> 8),
    ZR: isOdd(HeldKeys >> 9),
    Plus: isOdd(HeldKeys >> 10),
    Minus: isOdd(HeldKeys >> 11),
    Left: isOdd(HeldKeys >> 12),
    Up: isOdd(HeldKeys >> 13),
    Right: isOdd(HeldKeys >> 14),
    Down: isOdd(HeldKeys >> 15)
  };
}
console.log(bitMaskToStruct(HeldKeys))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...