RGDEngineЖурнал

Библиотека ввода.

Автор:

Готова к тестированию новая система ввода. Брать здесь. Критика приветствуется.

Зачем оно надо:
Идея в том, что гейм-программист не должен задумываться о том, какую именно клавишу нажал игрок, чтобы произвести то или иное действие. Его интересует сам факт, что игрок хочет выстрелить, повернуть голову и т.п. Поэтому появляется две сущности: команда (название для действия игрока) и хелпер (обьект-посредник, с которым работает программист, когда хочет узнать о действиях игрока).

Команда связывается с контролами ввода (причем для одной команды можно назначить несколько контролов). Например выстрел повесить на ctrl и левую кнопку мыши. Связку связку команда <-> контрол(ы) можно сохранять/загружать (будет реализовано позже).

Хелперы. Позволяют узнать о срабатывании команд. Поддерживается несколько видов (список будет расширен):
1) CButton
2) CTrigger
3) CKeyUp
4) CKeyDown
5) CRelativeAxis
6) CAbsoluteAxis

К хелперу можно обращаться в любой момент, чтобы узнать его статус, а так же можно назначить для него call-back функцию, чтобы обработать команду непосредственно в момент ее срабатывания:

class CTest
{
public:
  CTest();

  void update ();
  void onFire (bool bPress);

private:
  CButton btnFire;
};

CTest::CTest ()
{
  //...
  btnFire.attach(input, L"Fire");
  btnFire += boost::bind(CTest::onFire, this, _1);
}

void CTest::update ()
{
  if (btnFire())
  {
    //стрелять, т.к. игрок держит кнопку "огонь"
  }
}

void CTest::onFire (bool bPress)
{
  if (bPress)
  {
    //начать проигрывание звука стрельбы
  }
  else
  {
    //остановить проигрывание звука стрельбы
  }
}

Что делается дальше:
1) сохранение/загрузка раскладки
2) хелпер для потока символов (к примеру для текстового ввода)
3) написать классы для девайсов
4) пофиксить баг, когда при зажимании двух клавиш все последующие нажатия не проходят
5) включение/выключение команд

p.s. для тестового примера использовалась библиотека viv'а для работы с окнами windows.

29 января 2007