Zkrocení joysticku - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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é JoyBtn1JoyBtn4) 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:

Hlavní formuulář ukázkové aplikace

První krok

První 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):

procedure TForm1.FormCreate(Sender: TObject);
begin
  if joyGetNumDevs = 0 then
  begin
    Application.MessageBox('Na počítači není joystick.', 'Chyba', MB_ICONSTOP);
    Application.Terminate;
  end;
end;

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 joysticku

Pozici 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ů.

procedure TForm1.Timer1Timer(Sender: TObject);

  // pomocná procedura - v závislosti na hodnotě Flag nastaví barvu Panelu
  // na červenou nebo bílou
  procedure Colorize(Panel: TPanel; Flag: Boolean);
  begin
    if Flag then
      Panel.Color := clRed
    else
      Panel.Color := clWhite;
  end;

var
  JI: TJoyInfo;
begin
  // ošetření návratové hodnoty fce joyGetPos
  case joyGetPos(JOYSTICKID1, @JI) of
    JOYERR_NOERROR:
    begin
      // poloha se udává od 0 do 65535 - musíme souřadnice zmenšit
      JoyPointer.Left := Round(JI.wXpos / 256) - JoyPointer.Width div 2;
      JoyPointer.Top := Round(JI.wYpos / 256) - JoyPointer.Height div 2;

      // stav jednotlivých tlačítek zjistíme ANDovou maskou a podle výsledku
      // změníme barvu příslušného panelu
      Colorize(JoyBtn1, Boolean(JI.wButtons and JOY_BUTTON1));
      Colorize(JoyBtn2, Boolean(JI.wButtons and JOY_BUTTON2));
      Colorize(JoyBtn3, Boolean(JI.wButtons and JOY_BUTTON3));
      Colorize(JoyBtn4, Boolean(JI.wButtons and JOY_BUTTON4));
    end;
    MMSYSERR_NODRIVER:
    begin
      Application.MessageBox('Nemůžu najít ovladač joysticku.'
           , 'Chyba', MB_ICONSTOP);
      Application.Terminate;
    end;
    MMSYSERR_INVALPARAM:
    begin
      Application.MessageBox('Vnitřní chyba.', 'Chyba', MB_ICONSTOP);
      Application.Terminate;
    end;
    JOYERR_UNPLUGGED:
    begin
      Application.MessageBox('Joystick není připojen.', 'Chyba', MB_ICONSTOP);
      Application.Terminate;
    end;
  end;
end;

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.

Stáhnout ukázku + zdrojový kód (Delphi 3)

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: