Martin Vodák

Vývojářský blog - Martin Vodák



Podle kategorie

MonoGame–klávesnice pod kontrolou

Martin Vodák       31. 1. 2015       C#, XNA, Grafika, .NET       4308 zobrazení

Vítejte podruhé, posledně jsme se podávali na to, co to vlastně MonoGame je a v tomto díle budeme pokračovat. Máme modrou plochu na které je vykreslené logo MonoGame a to se pokusíme v tomto díle rozpohybovat pomocí klávesnice. Je to jeden z nejčastějších úkolů, které budeme při dělání her potřebovat.

Klávesnice a myš

Pro práci s klávesnicí a myší máme v MonoGame stejně jako v XNA k dispozici třídy Mouse a Keyboard. S jejich pomocí lze za použití metod GetState získat současný stav klávesnice a myši. U klávesnice máme k dispozici všechny stisklé klávesy a u myši navíc její polohu. Tento přístup nám ale při dělání složitějších her stačit nebude. Proč? Není totiž možné zjistit, jestli tlačítko myši bylo právě nyní stisknuto nebo právě nyní puštěno, stejně tak u klávesnice. Ale tento nedostatek si odstraníme s využitím vlastní pomocné třídy.

Začneme klávesnicí pomocí které rozpohybujeme logo MonoGame. Vytvoříme si novou privátní proměnnou kam budeme ukládat stav klávesnice:

KeyboardState keyboard;

Pokud nemáte v projektu příslušný jmenný prostor, tak si jej přidejte:

using Microsoft.Xna.Framework.Input;

Dále budeme potřebovat proměnnou s pozicí našeho obrázku:

Vector2 position;

A tu si hned v metodě Initialize nastavíme na výchozí polohu:

position=new Vector2(100,100);

V metodě Update si získáme stav klávesnice zavoláním metody GetState:

keyboard=Keyboard.GetState();

a ten budeme dále používat. V této struktuře máme připraveny i pomocné metody, které si použijeme v podmínce. V případě stisknutí pravé šipky na klávesnici chceme aby se obrázek posunul po ose X o jedničku.

if(keyboard.IsKeyDown(Keys.Right)){
  position.X+=1;
}

A v případě stisknutí levé šipky chceme aby se posouval zase zpět:

if(keyboard.IsKeyDown(Keys.Left)){
  position.X-=1;
}

Nesmíme si také zapomenout přepsat pozici pro vykreslení:

spriteBatch.Draw(texture,position,Color.White);

A máme hotovo. Pokud si nyní hru spustíme tak můžeme pěkně hýbat logem MonoGame.

Ale jak jsem říkal výše není to zrovna všeobecné řešení, pro další pokračování toho budeme potřebovat zjistit více. Toho dosáhneme snadno, stačí nám si uchovat předešlý stav klávesnice a myši a porovnat jej se současným. Takže když budeme chtít zjistit jestli byla klávesa stisknuta právě nyní tak musí platit, že v předešlém stavu je klávesa puštěna a v tomto je stisknuta. Ideální na to bude když si na to napíšeme pomocnou třídu. Nazveme ji třebas Input a bude celá statická. Přidáme si dvě proměnné pro starý stav klávesnice a pro současný stav klávesnice:

private static KeyboardState oldKeyboard;
private static KeyboardState keyboard;

Dále potřebujeme metodu, pomocí které oba stavy budeme updatovat, já bych jí nazval Update, ať se držíme zavedených názvů. Uložíme si nejprve starý stav klávesnice a zjistíme si nový:

public static void Update(){
  oldKeyboard = keyboard;
  keyboard = Keyboard.GetState();
}

A dále napíšeme tři pomocné metody. Máme totiž celkem čtyři možné stavy, které můžeme chtít detekovat:

  • klávesa nebyla nikdy stištěna vůbec (v obou stavech je puštěna)

  • klávesa byla právě nyní stištěna (v předchozím je puštěna a v tomto je stisknuta)

  • klávesa je držena (v obou stavech je klávesa stisknuta)

  • klávesa byla právě nyní puštěna (v předchozím stavu je stištěna a v tomto puštěna)

Jejich implementace je pak už velmi snadná a tak jen telegraficky všechny metody:

public static bool IsKeyUp(Keys key){
  return oldKeyboard.IsKeyUp(key) && keyboard.IsKeyUp(key);
}

public static bool IsKeyPressed(Keys key){
  return oldKeyboard.IsKeyUp(key) && keyboard.IsKeyDown(key);
}

public static bool IsKeyHold(Keys key){
  return oldKeyboard.IsKeyDown(key) && keyboard.IsKeyDown(key);
}

public static bool IsKeyReleased(Keys key){
  return oldKeyboard.IsKeyDown(key) && keyboard.IsKeyUp(key);
}

Jediné co nyní potřebujeme, aby možné třídu využívat, je zavolat její metodu Update v herní smyčce. A pak už jen využívat její služby, takže si předěláme posun obrázku na tuto třídu, řekněme, že budeme chtít při stisknutí šipky posunout obrázek jen jednou o 10 jednotek. Takže si to zkusíme, je to snadné:

if (Input.IsKeyPressed(Keys.Left)){
  position.X -= 10;
}
if (Input.IsKeyPressed(Keys.Right)){
  position.X += 10;
}

A máme hotovo. Pokud si nyní hru spustíme zjistíme, že při každém stisku nám obrázek poskočí. A to by mohlo myslím pro dnešek stačit. Příště se podíváme na to, jak ochočit myš. A taky bych si naplánoval nějakou snadnou hru, kterou si zkusíme napsat, než se vrhneme nějako na to 3D. Celý projekt si můžete stáhnout zde:

. Budu se těšit na vaše komentáře.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback