SGDK. Управляем джойстиком.

Update: исправлен нерабочий код. Спасибо Dmitriy за указание на проблему.

Предисловие

В этом уроке, мы рассмотрим 2 способа обработки нажатий:

  • Последовательный
  • Параллельный.

Приступим.

Последовательный способ обработки нажатий.

Создайте функцию handleInput(), внутри main.c вашего проекта. И перепишите туда следующий код.

void handleInput(){
  VDP_clearText(1,1,5);
  u16 value = JOY_readJoypad(JOY_1);
	
  if(value & BUTTON_LEFT) {
    VDP_drawText("Left",1,1);
  }
  if(value & BUTTON_RIGHT) {
    VDP_drawText("Right",1,1);
  }
}

Рассмотрим новые комманды:

VDP_clearText(1,1,5);

Данная комманда удаляет тайлы из указанной области. Синтаксис у неё следующий:

VDP_clearText(x_tile, y_tile, длина);
  • x_tile — указывает тайл по оси x
  • y_tile — задает тайл по оси y
  • длина — задает длину удаляемой области.

Получается, этой коммандой

VDP_clearText(1,1,5);

Мы удалили тайлы в области 1,1 по 1,5 (включительно).

u16 value = JOY_readJoypad(JOY_1);
  • Тип u16, можно представить как unsigned 16, что значит без-знаковое 16-ти битное число.
  • Функция JOY_readJoypad, задает джойстик (JOY_1), с которого мы будем считывать информацию, и возвращает информацию о нажатых кнопках.
if(value & BUTTON_LEFT) {
    VDP_drawText("Left",1,1);
}

Здесь мы, при помощи битовой маски(BUTTON_LEFT), проверили нажата-ли кнопка влево. Если нажата, то выводим текст на экран.

if(value & BUTTON_RIGHT) {
    VDP_drawText("Right",1,1);
  }

Тут, тоже самое, только для кнопки вправо.

Список битовых масок, доступен по адресу путь_установки_SGDK/doc/html/joy_8h.html

Функция готова, осталось её вызвать внутри main.

int main()
{
    while(1)
    {
	handleInput();
        SYS_doVBlankProcess();
    }
    return (0);
}

Теперь, скомпилируйте, запустите, и по-нажимайте влево, вправо. При нажатии на кнопку, должен появится текст на экране.

Теперь, разберем второй способ обработки нажатий.

Параллельный способ обработки нажатий.

Данный способ, в отличии от предыдущего, не требует постоянного вызова функции. Потому-что, он основан на обработчиках событий (Event Handler). Алгоритм тут следующий, создаем callback функцию, передаем её в другую функцию, и все, готово.

Callback функция — это функция, которую другая функция, принимает в качестве аргумента.

Создайте новую функция внутри main.c вашего проекта.

void handleInputSecond( u16 joy, u16 changed, u16 state) {
  VDP_clearText(1,1,5);
  if(joy == JOY_1) {
    if(state & BUTTON_LEFT) {
      VDP_drawText("Left",1,1);
    }
    if(state & BUTTON_RIGHT) {
      VDP_drawText("Right",1,1);
    }
  }
}

Разберем данный код:

void handleInputSecond( u16 joy, u16 changed, u16 state)

Данная функция принимает 3 аргумента:

  • joy — число задающее джойстик, с которого была нажата клавиша. (JOY_1, JOY_2)
  • changed — если изменилась нажатая клавиша, возвращает 1, в противном случае 0.
  • state — задает нажатую клавишу.

Остальной код, мы разобрали выше. Теперь, создадим обработчик событий внутри main.

int main()
{
  JOY_init();
  JOY_setEventHandler(&handleInputSecond);
  while(1)
  {
    SYS_doVBlankProcess();
  }
  return (0);
}

Разберем код.

JOY_init();

Производит первичную настройку джойстика (без этой комманды, данный способ работать не будет).

JOY_setEventHandler(&handleInputSecond);

Здесь мы передали, наш обработчик событий (callBack функция).

Все, готово. Второй способ, по функционалу, ничем не отличается от первого. Поэтому, выбирайте что хотите.

Итоговый результат.

avatar