XNA tvorba v 3D - Klávesnica a myš
Vitajte po dvanástykrát. Ešte než sa pustíme do tvorby prvej skutočnej hry používajúci náš engine, tak potrebujeme vytvoriť pár posledných vecí, aby sme sa nimi nemuseli zaoberať nabudúce a tvorba hry nám išla viac od ruky. Chýbajú nám nejaké jednotné rozhranie pre klávesnicu a myš. Našťastie už ako to bude fungovať naznačil zmijozelák vo svojom článku. Takže sa nemusíme zdržovať teóriou, všetko dôležité si môžete prečítať v onom článku.
Všetko ohľadom užívateľského vstupu budeme zhromažďovať v triede
Input
. Vytvoríme si ju teda v projekte s enginom, skontrolujeme
menný priestor a urobíme triedu veřejnou.Tak ako to napokon robíme vždy.
Začneme s klávesnicou. Vytvoríme si dve premenné. V jednej si budeme
skladovať súčasný stav klávesnice a v druhej stav, ktorý bol minule.
Jedine tak dokážeme zistiť, či je klávesa stlačená novo a alebo či ju
držíme dlhšiu dobu:
KeyboardState state; KeyboardState staryState;
V nám známej metóde Update
budeme ukladať starý stav do
premennej staryState
a nový načítať do premennej
state
. Pre zistenie súčasného stavu použijeme metódu
GetState
triedy Keyboard
:
public void Update(){ staryState = state; state = Keyboard.GetState(); }
Výborne. Teraz už nám len schádza metódy, pomocou ktorých zistíme stav. Začneme metódou, ktorá nám zistí či ak čudlík bol stlačený novo, teda predtým nebol, ale teraz je:
public bool StisknutaKlavesa(Keys co){ return staryState.IsKeyUp(co) && state.IsKeyDown(co); }
Podobne vytvoríme metódu, ktorá zistí či ak bola klávesa držaná. Systém je rovnaký ako predtým. Čudlík bol stlačený predtým a je stlačený aj teraz:
public bool DrzenaKlavesa(Keys co){ return staryState.IsKeyDown(co) && state.IsKeyDown(co); }
Posledný metóda, ktorá sa bude hodiť, je či ak bol čudlík stlačený, ale teraz už nie je, teda že bola klávesa uvoľnená:
public bool PustenaKlavesa(Keys co){ return staryState.IsKeyDown(co) && state.IsKeyUp(co); }
Na klávesnici sme už dobre vybavení. Zostáva už len pripraviť sa rovnako na myš. Opäť vytvoríme dve premenné, kde budeme skladovať dva stavy:
MouseState mysState; MouseState mysStaryState;
Opäť je v metóde Update
naplníme novými hodnotami:
mysStaryState = mysState; mysState = Mouse.GetState();
Neprehliadli ste sa, naozaj je to rovnaké ako u klávesnice. U myši nás toho bude zaujímať trochu viac. Hlavne o koľko sme sa posunuli od minule na oboch súradniciach ao ako na tom sme s tlačidlami myši a kolieskom. Začneme posuvom, pretože je najľahší. Len od seba odčítame obe hodnoty a budeme ich vracať vo verejných premenných:
public int DeltaX{ get{ return mysState.X - mysStaryState.X; } } public int DeltaY{ get{ return mysState.Y - mysStaryState.Y; } }
Rovnako naložíme s kolieskom u myši:
public int DeltaKolecko{ get{ return mysState.ScrollWheelValue - mysStaryState.ScrollWheelValue; } }
Na myši máme celkom tri čudlík. Ľavý, koliesko a pravý. Opäť budeme skúmať tri stavy ako u klávesnice. To máme celkom deväť metód, keďže je systém rovnaký ako vyššie, tak iba telegraficky:
public bool LeveTlacitkoStisknuto(){ return mysStaryState.LeftButton == ButtonState.Released && mysState.LeftButton == ButtonState.Pressed; } public bool LeveTlacitkoDrzeno(){ return mysStaryState.LeftButton == ButtonState.Pressed && mysState.LeftButton == ButtonState.Pressed; } public bool LeveTlacitkoPusteno(){ return mysStaryState.LeftButton == ButtonState.Pressed && mysState.LeftButton == ButtonState.Released; } public bool StredniTlacitkoStisknuto(){ return mysStaryState.MiddleButton == ButtonState.Released && mysState.MiddleButton == ButtonState.Pressed; } public bool StredniTlacitkoDrzeno(){ return mysStaryState.MiddleButton == ButtonState.Pressed && mysState.MiddleButton == ButtonState.Pressed; } public bool StredniTlacitkoPusteno(){ return mysStaryState.MiddleButton == ButtonState.Pressed && mysState.MiddleButton == ButtonState.Released; } public bool PraveTlacitkoStisknuto(){ return mysStaryState.RightButton == ButtonState.Released && mysState.RightButton == ButtonState.Pressed; } public bool PraveTlacitkoDrzeno(){ return mysStaryState.RightButton == ButtonState.Pressed && mysState.RightButton == ButtonState.Pressed; } public bool PraveTlacitkoPusteno(){ return mysStaryState.RightButton == ButtonState.Pressed && mysState.RightButton == ButtonState.Released; }
Hotovo. Trieda je pripravená pre ďalšie používanie. Stačí ju len zaštepiť do enginu, vstup z klávesnice je spoločný pre všetky herné okná, takže ho umiestnime priamo do enginu. Otvoríme si triedu s enginom, založíme verejnú premennú:
private Input fInput; public Input Input{ get { return fInput; } }
a v konstruktoru ju vytvoríme:
fInput = new Input();
Posledný krok čo nám chýba je zavolať metódu Update
,
urobíme to ako prvá vec v Update
metóde u enginu, teda ihneď po
priradení herného času. Pre istotu celá metóda bude vyzerať takto:
public void Update(GameTime time){ this.gameTime = time; fInput.Update(); foreach (GameScreen okno in Screens){ okno.Update(); } }
Vstup z klávesnice a myši sme si teda skrotili. Nabudúce opustíme teoretickú rovinu a skúsime si so všetkým čo sme vytvorili pohrať. Sami si skúste napísať napríklad meniace sa pozadie po stlačení klávesy, alebo kliknutie myši. Dopredu prezradím, že od nabudúce sa pokúsime urobiť bludisko. Nebude to na jeden diel to rozhodne nie, takže nečakajte hneď ohromujúce výsledky. Očakávam tiež komentáre pod článkom, pripomienky, otázky a podobne.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 218x (1.7 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C#