IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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#

 

Predchádzajúci článok
XNA tvorba v 3D - Model druhýkrát
Všetky články v sekcii
Základy 3D grafiky a tvorba enginu
Preskočiť článok
(neodporúčame)
XNA tvorba v 3D - vykreslenie trojuholníka
Článok pre vás napísal vodacek
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Vodáček dělá že umí C#, naplno se již pět let angažuje v projektu ŽvB. Nyní studuje na FEI Upa informatiku, ikdyž si připadá spíš na ekonomice. Není mu také cizí PHP a SQL. Naopak cizí mu je Java a Python.
Aktivity