Hlavní navigace

SVGAlib: joysticky

Jakub Matys

V dnešním dílu začneme menší podkapitolku. Bude se jednat o joysticky.

Nejdříve bych chtěl představit ještě dvě funkce, na které jsem v minulém díli pozapoměl:

void keyboard_clearstate(void);

Restartuje status všech kláves. Znamená to tedy, že všechny nevyzvednuté události jsou ztraceny.

typedef void (*__keyboard_handler) (int scancode, int press);
/* tento ukazatel je uz nadefinovan v souboru vgakeyboard.h */
void keyboard_seteventhandler(__keyboard_handler handler);
void keyboard_setdefaulthandler(void); 

Tyto funkce umožní nastavení handleru klávesnice, ten bude volán, pokud funkce keyboard_update a keyboard_wait­forupdate skončí úspěšně. press je KEY_EVENTRELEASE nebo KEY_EVENTPRESS, pokud klávesa scancode byla uvolněna nebo stisknuta.

Joysticky v svgalib

Nyní se už pustíme do oněch slíbených joysticků. Chtěl bych jen upozornit, že všechny představované funkce používají hlavičkový soubor vgajoystick.h.

typedef void (*__joystick_output) (const char *msg);
int joystick_init(int joydev, __joystick_output jo);

Tato funkce otevírá zařízení joysticku. Pokud skončí neúspěšně, vrátí 0, jinak nenulovou hodnotu.

Svgalib podporuje několik typů joysticků, odpovídající jména těchto typů mohou být nakonfigurována v libvga.config.

Parametr joydev indikuje, který joystick má být inicializován. Svgalib dokáže obhodpodařit až čtyři joysticky (joydev = 0 až joydev = 3).

Programátor může vypsat uživateli další pokyny (např. jak joystick nakalibrovat) pomocí funkce odkazované parametru jo. Pokud je tento parametr NULL, nebude tyto informace možné vytisknout.

void joystick_close(int joydev);

Pokud bylo zařízení joydev otevřeno, tak jej uzavře.

Zadáním joydev = –1 docílíte uzavření všech regulérně otevřených zařízení.

int joystick_update(void);

Tato funkce má za úkol zjistit, zda se změnily některé důležité informace, jako např. stav tlačítek. Jestliže ano, zavolá vhodné handlery.

Nenulová hodnota je vrácena, pokud byl změněn status jakéhokoliv joysticku. Jednoduchým trikem můžeme zjistit, o jaké zařízení se jedná. Jestliže je logický součet vrácené hodnoty a výrazu (1 << joydev) větší než nula, změnilo toto zařízení svůj status.

typedef void (*__joystick_handler) (int event, int number, char value, int
joydev);
void joystick_sethandler(int joydev, __joystick_handler jh);
void joystick_setdefaulthandler(int joydev); 

Po volání funkce joystick_init je implicitně použit defaultní handler pro otevřený joystick. Tento handler udržuje statusovou tabulku, která může být čtena funkcemi joystick_getaxis, joystick_getbutton, joystick_button1|2|3|4, joystick_getb1|2|3|4, joystick_x|y|z a joystick_getx|y|z – ty mají za úkol získávat hodnoty osy, stavy tlačítek atd. a o všech se budeme bavit.

Pokud potřebujete definovat svůj vlastní handler, můžete ve své funkci zpracovávat následující parametry:

event
  • JOY_EVENTBUTTON­DOWN – tlačítko bylo stisknuto
  • JOY_EVENTBUTTONUP – tlačítko bylo uvolněno
  • JOY_EVENTAXIS – byla měněna pozice na joysticku
number
indentifikuje tlačítko nebo osu, které tato událost patří
value
obsahuje novou pozici osy (od –128 do 127)
joydev
identifikuje zařízení joisticku (to umožňuje použít jeden handler pro více joysticků)
char joystick_getnumaxes(int joydev);
char joystick_getnumbuttons(int joydev);

Zjistí počet os a tlačítek. Staré verze protokolu joysticku (0.*) hlásily pouze dvě osy (x a y) a čtyři tlačítka. Svgalib však podporuje až 127 os a tlačítek (za předpokladu, že to umožňuje driver).

To by bylo pro dnešek vše, v příštím dílu budeme pokračovat v představování funkcí pro práci s joysticky.

Našli jste v článku chybu?