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:
C/C++
Allegro - Myš a klávesnice (5. díl)
18. ledna 2002, 00.00 | To by nebyla ta pravá hra kdyby se nemohla ovládat, že? A proto se v dnešním díle seznámíme s ovládáním klávesnice a myši v herní knihovně Allegro. Nakonec bude jako vždy příklad.
Opět Vás vítám u seriálu o Allegru. Již brzy budeme schopni vytvořit nějakou tu hru, která už bude hratelná, ale každá hra se nějak ovládá. Většinou pomocí klávesnice a myši. My jsme se prozatím seznamovali s grafikou a grafickým výstupem v Allegru. Dneska si ale konečně ukážeme jaké možnosti nám allegro nabízí na vstupní zařízení jako jsou myš a klávesnice.
Poznámka k nové verzi Allegra: Na konci programu už nemusíme psát funkci allegro_exit(); a za konečnou závorkou funkce main() zapíšeme makro END_OF_MAIN();
Tedy malá ukázka:
|
Od teď budeme psát programy tímto stylem. Samozřejmě, aby byl program funkční museli bychom přiincludovat soubor allegro.h.
Klávesnice
Když chceme začít používat v Allegru klávesnici či jiná vstupní zařízení musíme to Allegru nějak říct. K tomu slouží funkce:
int install_keyboard();
Ta nám zařídí inicializaci klávesnice a několika proměnných. ( Po této inicializaci už bychom neměli používat standardní funkce jazyka C pro obsluhu klávesnice. Chovají se občas divně. ) Jelikož je řeč o klávesnici tak se budu věnovat pouze klávesnici ( pak zjistíte, že si jsou s myší podobné ). Tedy tato funkce nám inicializuje proměnnou key, což je jednorozměrné pole charů o 128 prvcích.
Hodnota jednotlivých prvků je 0, pokud není zmáčknuta příslušná klávesa a -1 pokud je klávesa zmáčknuta.
Jak poznáme která klávesa je a která není zmáčknuta?
No je to jednoduché. Allegro nám dává k dispozici přes sto definic. Pro každou klávesu minimálně jednu.
Definice na rozdíl o proměnných jsou psána velkými písmeny např.: KEY_ENTER. Tedy stylem: nejdříve slovíčko KEY pak podtržítko a pak příslušný název klávesy na klávesnici.
V manuálu k Allegru jsou k dispozici tyto možnosti:
|
A jak se to používá?
Naprosto jednoduše. Jméno definice použijeme jako index v poli charů key.
Tedy například:
|
A tak to podobně funguje i s dalšími klávesami. Jako index stačí dosadit jednu z výše uvedených definic a tak si s přehledem "odchytit" stavy kláves.
Více si ukážeme na příkladu na konci této kapitoly.
Myš
Se v poslední době stává čím dál tím více standardem v herním průmyslu. Pomalu už nevyjde nová hra, která by nepodporovala ovládání (alespoň z části) pomocí myši. My se proto taky seznámíme s tímto (dalo by se říci dnešním standardem IBM PC) zařízením více. Nebo spíše s jeho odchytáváním událostí ( klikáním, pohybem atd ).Tak jako u klávesnice existuje funkce pro zapnutí tak samozřejmě tomu je tak i u myši. Slouží k tomu funkce:
int install_mouse();
Pokud proběhne vše v pořádku vrací funkce číslo různé od -1 a při chybě teda vrací -1.
(Pokud chceme myš vypnou slouží k tomu funkce void remove_mouse(); )
Tato funkce nám inicializuje několik proměnných. Jako první bych uvedl tyto:
extern volatile int mouse_x;
extern volatile int mouse_y;
extern volatile int mouse_z;
extern volatile int mouse_b;
extern volatile int mouse_pos;
První dvě proměnné jsou jasné. Jsou to X-ová a Y-ová souřadnice myši. mouse_pos uchovvá taky souřadnice a to tak, že v horním slově (wordu) souřadnici X a v dolním slově (wordu) souřadnici Y ( upozorňuji na to, že velikost sizeof(int) jsou 4 byty ).
mouse_z nám udává polohu scrolovacího kolečka na myši. Mě se to ale bohužel nepovedlo rozchodit.
A jako poslední nejzajímavější je proměnná mouse_b, která nám v sobě uchovává stavy tlačítek. Pokud je 0. bit nastaven na jedna je stisknuté levé tlačítko, pokud je 1. bit nastaven na jedna je stisknuté pravé tlačítko a pokud je 2. bit nastaven na jedna je stisknuté prostřední tlačítko.
Pro zjištění je asi nejjednodušší použít logický bitový součin.
Např.:
|
Tyto informace jsou pro nás bohatě dostačující co se týče pozice a události tlačítek, ale teď k tomu co je ještě potřeba zavolat, aby se nám kurzor objevil na obrazovce.
K tomu slouží funkce:
void show_mouse(BITMAP *bmp);
která jako parametr bere BITMAPu na kterou si přejeme kurzor myši zobrazit.
Volání může vypadat například takto: show_mouse(screen);
Opak této funkce, tedy pro opětovné skrytí kurzoru je funkce:
show_mouse(NULL);
A teď ještě k dalším funkcím v Allegru pro práci s myší.
Nastavení pozice kurzoru na námi zadané souřadnice:
void position_mouse(int x, int y);
Nastavení citlivosti myši:
void set_mouse_speed(int xspeed, int yspeed);
Jako parametry jsou hodnoty zvlášť pro x-ovou a y-ovou souřadnici. Standardně je pro obě souřadnice hodnota 2. Vyšší hodnota znamená vyšší citlivost ( tedy pro přemístění kurzoru ujedeme větší vzdálenost na podložce ) a nižší hodnota znamená přesný opak.
Rozsah myši si můžeme taky navolit podle nás:
void set_mouse_range(int x1, int y1, int x2, int y2);
Této funkci dáme parametry souřadnice obdélníku v jakém se může naše myš ( nebo spíše kurzor ) pohybovat. Pokud tedy chcete např., aby se kurzor pohyboval pouze v horní polovině obrazovky dosáhnete toho voláním této funkce s těmito parametry:
set_mouse_range(0, 0, (SCREEN_W / 2) - 1, (SCREEN_H / 2) - 1);
A nyní ještě něco ke kurzorům
To znamená např.: jak si změním kurzor na svůj => třeba na křížek a taky jak si změním v kurzoru pozici, která mi udává souřadnice. Je blbý, aby křížek reagoval na levý horní roh :), když má reagovat na prostředek.
Ke změně slouží funkce:
void set_mouse_sprite(BITMAP *sprite);
Tato funkce bere jako parametr BITMAPu, kterou si můžete nakreslit v nějakém graf. programu anebo si ji jednoduše namalovat pomocí Allegra.
A reakci kurzoru nastavíme pomocí:
void set_mouse_sprite_focus(int x, int y);
Jako parametry máme samozřejmě pozici v naší BITMAPě. Defaultní nastavení je 0, 0.
Dneska jsme si toho ukázali hodně z toho co Allegro nabízí. Pokud chcete vědět ještě více není nic jednoduššího než se podívat do manuálu Allegra. Anebo si taky můžete prohlédnout ukázkové programy v Allegru.
Příklad:
Pro lepší pochopení si uvedeme opětovný příklad na dnění funkce.Ovládání:
R - zvětšuje intenzitu červené barvy max. 255
Shift + R - zmenšuje intenzitu červené barvy min. 0
G - zvětšuje intenzitu zelené barvy max. 255
Shift + G - zmenšuje intenzitu zelené barvy min. 0
B - zvětšuje intenzitu modré barvy max. 255
Shift + B - zmenšuje intenzitu modré barvy min. 0
ESC nebo pravé tlačítko myší - konec programu
Levé tlačítko - kreslí buď tečky nebo lomenou čáru
Enter - mění druh kreslení - viz levé tlačítko
Poznámka:
V programu je malý obdélník. Pokud se kurzor objeví uvnitř tak se obrázek
kurzoru změní na standardní šipku a pokud se objeví pryč z obdélníku
objeví se místo šipky křížek. Kurzor se může pohybovat pouze v rozmezí
horní poloviny obrazovky.
Program:
|
Minule jsem se zmínil, že si uděláme "velký" příklad, který bude obsahovat vše co jsme se doposud naučili, ale vzhledem k rozsáhlosti dnešního článku jsem se rozhodl vyhradit pro to nový díl o
Allegru, který ponese hrdě už číslo 6. Tedy příště se těšte už na
větší aplikaci.
Zdrojový příklad si můžete stáhnou zde.
Obsah seriálu (více o seriálu):
- Allegro - Knihovna pro programování her I.
- Allegro - Knihovna pro programování her II.
- Allegro - Knihovna pro programování her III.
- Allegro - Knihovna pro programování her IV.
- Allegro - Myš a klávesnice (5. díl)
- Allegro - Jednoduchá hra Střelba (6. díl)
- Allegro - Instalace a konfigurace (7. díl)
- Allegro - Hudba a zvuky (8. díl)
- Allegro - Midi a zvukové proudy (9. díl)
- Allegro - Časovač (10. díl)
- Allegro - Vektory a synchronizace scény (11. díl)
- Allegro - Datové soubory a práce s nimi (12. díl)
- Allegro - Datové soubory a práce s nimi podruhé (13. díl)
- Allegro - Tetris, nic těžkého (14. díl)
- Allegro - Animace (15. díl)
- Allegro - Bitmapy do hloubky a page flipping(16. díl)
- Allegro - MP3 (17. díl)
- Allegro - MP3 podruhé (18. díl)
- Allegro - MP3 potřetí (19. díl)
Diskuse k článku
-
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