Как стать автором
Обновить

Комментарии 4

Энтузиазм -- это похвально.

Только вот что происходит, когда не освоил битовые операции в школе:

Вместо

// проверка нажатия кнопки вверх

if((keyCode & (0x80 | JOYPAD_UP) == (0x80 | JOYPAD_UP) && y > 0x7F) {

Зачем-то пишется цикл на 256 повторов:

for (int i = 0x0000; i <= 0xF000; i+=0x0100) {

// проверка нажатия кнопки вверх

if(keyCode == (i+0x0081) && y > 0x7F) {

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

Например, 0x81 == 0x80 + JOYPAD_UP == -127.

Очевидно, что все кнопки описываются битовыми флагами в возвращаемом значении метода () и это значение может указывать на нажатие нескольких кнопок одновременно. Непонятен только смысл флага 0x80. Среди констант его нет. Возможно, он всегда выставлен, или обозначает, что хотя бы одна кнопка нажата. Если его значение не важно, то первую проверку можно упростить до:

// проверка нажатия кнопки вверх

if(keyCode & JOYPAD_UP != 0 && y > 0x7F) {

Кстати, проверку && y > 0x7F стоило бы сделать вложеним оператором. Зачем смешивать в одном проверку кнопки и проверку координаты? Получится ведь неэффективно. Лучше написать так:

// проверка нажатия кнопки вверх

if(keyCode & JOYPAD_UP != 0) {

keyCode = JOYPAD_UP;

if(y > 0x7F) {

// do something

Цикл выполниться не 256 раз, а 242.

Удивительно, как я раньше не заметил, что это эквивалентно 0x80 | «нужная константа».

Я проверил, и действительно, чтобы зафиксировать нажатие, достаточно проверить, установлены ли нужные биты. Таким образом, мультитач будет работать правильно. Я обновил свой шаблонный проект, и теперь стрелка движется во все 8 направлений. В связи с новой информацией, придется менять главу статьи про управление.

Вот код который в итоге получился для кнопки Вверх:

if ((keyCode & SegaGenesis.JOYPAD_UP) != 0) {
          if (y < 0x7F) {
            continue;
          }
          //Do something
        }

Я изучил все константы в классе SegaGenesis, но не нашёл ни одной, которая бы равнялась 0x80. Скорей всего так и есть:

"Возможно, он всегда выставлен, или обозначает, что хотя бы одна кнопка нажата."

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации