Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Delphi
Zkrocení joysticku
delphi_joystick
21. března 2001, 00.00 | Víte, že joystick se dá obsluhovat pomocí Windows API i bez DirectX? Článek pomocí ukázkového programu demonstruje, jak na to.
Pokud potřebujete vytvořit aplikaci, která bude umět zpracovávat signály z joysticku (většinou to bude nejspíš nějaká hra), je velice pravděpodobné, že použijete nějakou sadu komponent typu DelphiX, založenou na DirectX. To je ale v některých případech vytahování kanónu na vrabce, protože Windows už mají podporu joysticku zabudovanou přímo ve svém API. Nyní si ukážeme, jak tuto podporu využít. Naším cílem bude napsat aplikaci, která bude ověřovat správnou funkci joysticku - tedy znázorňovat jeho polohu a stav tlačítek.
Nejdříve na formulář umístíme jeden panel o velikosti 260x260 bodů a do něj přesně doprostřed malý TShape (nazveme ho JoyPointer) - bude sloužit jako znázornění polohy joystiku. K tomu přidáme čtyři malé panely (pojmenované JoyBtn1 až JoyBtn4) někam bokem - budou představovat tlačítka. Nebudu tu popisovat přesné nastavení vzhledových vlastností, raději se podívejte na obrázek, jak by celý formulář měl vypadat:
První krokPrvní věcí, kterou bude třeba zjistit, je informace, zda je vůbec nějaký joystick k počítači připojen. To obstará funkce joyGetNumDevs. Co vrací je asi jasné už z jejího názvu - počet joysticků připojených k danému počítači. Zde by asi bylo slušností říct, že celé API podporuje maximálně dva joysticky, označené konstantami JOYSTICKID1 a JOYSTICKID2.
Test připojení joysticků provedeme hned po spuštění programu, tedy v události OnCreate hlavního formuláře. Předtím je ještě potřeba přidat do seznamu uses unitu MMSystem, ve které jsou deklarovány všechny funkce API k joystiku (a k multimédiím vůbec):
|
Pro jednoduchost budeme celou aplikaci dál psát tak, že bude fungovat jen s prvním joystickem, i kdyby jich v počítači bylo několik. Také budeme používat jen základní verzi API, která umožňuje práci jen s joysticky s maximálně čtyřmi tlačítky a dvěma osami pohybu (X a Y). Složitější joystiky, joypady, gamepady a podobná zařízení se samozřejmě dají obsluhovat podobně, je to jen trochu psaní navíc.
Poloha joystickuPozici joysticku zjistíme pomocí funkce joyGetPos. Ta si bere dva parametry: První je číslo joysticku, jehož pozice nás zajímá; druhý je odkaz na strukturu TJoyInfo. Do jejích členů funkce zapíše pozici joysticku a stav stisknutí tlačítek. Návratovou hodnotou funkce může být jedna z následujících konstant:
Konstanta | Význam |
---|---|
JOYERR_NOERROR | volání funkce proběhlo v pořádku |
MMSYSERR_NODRIVER | funkce nenalezla ovladač joysticku |
MMSYSERR_INVALPARAM | funkci byl předán chybný parametr |
JOYERR_UNPLUGGED | joystick není právě připojen k počítači |
Naším jediným zbývajícím úkolem ke zdárnému dokončení aplikace tedy je "pověsit" na speciálně k tomu vytvořený Timer proceduru, která periodicky zjistí polohu a stav tlačítek joysticku a patřičně upraví objekty na formuláři. Nesmíme přitom zapomenout ošetřit i chybové stavy. Timer doporučuji nastavit na periodu okolo 100ms - měření 10x za sekundu je dostačující pro většinu případů.
|
Kód ukázkového programu lze vcelku lehce upravit např. tak, aby se joystickem upravovala poloha nějakého objektu ve hře apod. Tyto úpravy už ovšem nechávám na čtenářích a jejich fantazii.
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007