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

C# .NET XNA game studio 3D grafika XNA tvorba ve 3D - Klávesnice a myš

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ě.


 

Stáhnout

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

 

  Aktivity (1)

Článek pro vás napsal vodacek
Avatar
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.

Jak se ti líbí článek?
Celkem (3 hlasů) :
4.666674.666674.666674.666674.66667


 



 

 

Komentáře

Avatar
trixxcz
Člen
Avatar
trixxcz:

Pěkně se ty tvé články čtou, to se musí nechat... :) Jen detailík, na konci cpeš fInput.Update() do metody Draw, nikoli do Update :-) Teda alespoň v ukázce kódu.

 
Odpovědět 12.1.2013 23:21
Avatar
vodacek
Redaktor
Avatar
Odpovídá na trixxcz
vodacek:

sakra já to tak mám všude i v kodu, jejda, děkuju za upozornění a za tu pochvalu také

 
Odpovědět 13.1.2013 9:31
Avatar
trixxcz
Člen
Avatar
Odpovídá na vodacek
trixxcz:

Rádo se stalo, do kódu jsem ti nekoukal noo...

 
Odpovědět 13.1.2013 9:52
Avatar
Hudson_Hawk
Člen
Avatar
Hudson_Hawk:

Taky chci poděkovat za celý tenhle seriál, je fakt super a vážím si toho, že si někdo dal tu práci a takhle pěkně to sepsal ;) (Sice se mi párkrát stalo, že jsem si musel stáhnout originální kód, protože jsem v pár situacích úplně nepochopil popis co a kam... ale to bude spíš můj problém ;)) Takže ještě jednou děkuji a jedu dál!! :D

 
Odpovědět  +2 18.7.2013 11:15
Avatar
vodacek
Redaktor
Avatar
Odpovídá na Hudson_Hawk
vodacek:

matení nepřítele je můj primární úkol

 
Odpovědět  +1 18.7.2013 11:45
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.