Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

XNA tvorba ve 3D - Klávesnice a myš

V minulé lekci, XNA tvorba ve 3D - Model podruhé, jsme si náš model přenesli do herního enginu.

Vítejte podvanácté. Ještě než se pustíme do tvorby první skutečné hry používající náš engine, tak potřebujeme vytvořit pár posledních věcí, abychom se jimi nemuseli zabývat příště a tvorba hry nám šla více od ruky. Chybí nám nějaké jednotné rozhraní pro klávesnici a myš. Naštěstí již jak to bude fungovat naznačil zmijozelák ve svém článku. Takže se nemusíme zdržovat teorií, vše důležité si můžete přečíst v onom článku.

Vše ohledně uživatelského vstupu budeme shromažďovat v třídě Input. Vytvoříme si ji tedy v projektu s enginem, zkontrolujeme jmenný prostor a učiníme třídu veřejnou.Tak jak to ostatně děláme vždycky. Začneme s klávesnicí. Vytvoříme si dvě proměnné. V jedné si budeme skladovat současný stav klávesnice a v druhé stav, který byl minule. Jedině tak dokážeme zjistit, jestli je klávesa stisknutá nově a nebo jestli ji držíme delší dobu:

KeyboardState state;
KeyboardState staryState;

V nám známé metodě Update budeme ukládat starý stav do proměnné staryState a nový načítat do proměnné state. Pro zjištění současného stavu použijeme metodu GetState třídy Keyboard:

public void Update(){
  staryState = state;
  state = Keyboard.GetState();
}

Výborně. Teď už nám jen schází metody, pomocí kterých zjistíme stav. Začneme metodou, která nám zjistí zda-li čudlík byl stisknut nově, tedy předtím nebyl, ale nyní je:

public bool StisknutaKlavesa(Keys co){
  return staryState.IsKeyUp(co) && state.IsKeyDown(co);
}

Obdobně vytvoříme metodu, která zjistí zda-li byla klávesa držena. Systém je stejný jako předtím. Čudlík byl stisknut předtím a je stisknut i nyní:

public bool DrzenaKlavesa(Keys co){
  return staryState.IsKeyDown(co) && state.IsKeyDown(co);
}

Poslední metoda, která se bude hodit, je zda-li byl čudlík stisknut, ale nyní už není, tedy že byla klávesa uvolněna:

public bool PustenaKlavesa(Keys co){
  return staryState.IsKeyDown(co) && state.IsKeyUp(co);
}

Na klávesnici jsme už dobře vybaveni. Zbývá už jen připravit se stejně na myš. Opět vytvoříme dvě proměnné, kde budeme skladovat dva stavy:

MouseState mysState;
MouseState mysStaryState;

Opět je v metodě Update naplníme novými hodnotami:

mysStaryState = mysState;
mysState = Mouse.GetState();

Nepřehlédli jste se, opravdu je to stejné jako u klávesnice. U myši nás toho bude zajímat trochu víc. Hlavně o kolik jsme se posunuli od minule na obou souřadnicích a o jak na tom jsme s tlačítky myši a kolečkem. Začneme posuvem, protože je nejlehčí. Jen od sebe odečteme obě hodnoty a budeme je vracet ve veřejných proměnných:

public int DeltaX{
  get{
    return mysState.X - mysStaryState.X;
  }
}

public int DeltaY{
  get{
    return mysState.Y - mysStaryState.Y;
  }
}

Stejně naložíme s kolečkem u myši:

public int DeltaKolecko{
  get{
    return mysState.ScrollWheelValue - mysStaryState.ScrollWheelValue;
  }
}

Na myši máme celkem tři čudlíky. Levý, kolečko a pravý. Opět budeme zkoumat tři stavy jako u klávesnice. To máme celkem devět metod, jelikož je systém stejný jako výše, tak pouze 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. Třída je připravena pro další používání. Stačí ji jen naroubovat do enginu, vstup z klávesnice je společný pro všechna herní okna, takže jej umístíme přímo do enginu. Otevřeme si třídu s enginem, založíme veřejnou proměnnou:

private Input fInput;

public Input Input{
  get { return fInput; }
}

a v konstruktoru ji vytvoříme:

fInput = new Input();

Poslední krok co nám chybí je zavolat metodu Update, uděláme to jako první věc v Update metodě u enginu, tedy ihned po přiřazení herního času. Pro jistotu celá metoda bude vypadat 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 jsme si tedy zkrotili. Příště opustíme teoretickou rovinu a zkusíme si se vším co jsme vytvořili pohrát. Sami si zkuste napsat třeba měnící se pozadí po stisknutí klávesy, nebo kliknutí myši. Dopředu prozradím, že od příště se pokusíme udělat bludiště. Nebude to na jeden díl to rozhodně ne, takže nečekejte hned ohromující výsledky. Očekávám také komentáře pod článkem, připomínky, dotazy a podobně.

Příště, XNA tvorba ve 3D - vykreslení trojúhelníku, si napíšeme rozhraní pro klávesnici a myš, je to poslední důležitá věc, kterou je potřeba udělat, aby engine byl použitelný pro něco praktičtějšího a více použitelného. Čekám také na komentáře pod článkem, kterým se nějak nechce. Zatím tedy na shledanou a snad se uvidíme příště.


 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 218x (1.7 MB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Předchozí článek
XNA tvorba ve 3D - Model podruhé
Všechny články v sekci
Základy 3D grafiky a tvorba enginu
Přeskočit článek
(nedoporučujeme)
XNA tvorba ve 3D - vykreslení trojúhelníku
Článek pro vás napsal vodacek
Avatar
Uživatelské hodnocení:
3 hlasů
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