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#