speciál
Vývoj her v XNA #14: 2D hra s raketkou #5

Vývoj her v XNA #14: 2D hra s raketkou #5
Vývoj her v XNA #14: 2D hra s raketkou #5
08:37, 11.04.2011

Už máme skoro vše hotovo, ale slíbili jsme si, že naimplementujeme ještě GameOver a restart hry. Oboje je dost jednoduché, takže tento díl bude celkem krátký. Taková jednoduchá tečka za naší hrou.

Typický GameOver si naimplementujeme tak, že po vypršení všech životů se hra zastaví a nápis se zobrazí na obrazovce. Je to takové old-school vypsání GameOver, které je docela běžné na starých herních automatech.

Nejdříve si tedy musíme naimplementovat onen nápis. Nejlepší bude, když jej budeme vykreslovat doprostřed obrazovky. To musíme tak nějak hrubě vycentrovat sami.

Založíme si tedy nový spritefont. Editací XML zvětšíme velikost. Spritefont pojmenujeme GameOver. Velikost písmen bude 34.

Založíme si proměnnou třeba spritefontGameOver. Nahrajeme do něj náš font a vytvoříme v metodě Draw nápis GameOver.

spriteBatch.DrawString(spritefontGameOver, "Game Over", new Vector2(((int)GraphicsDevice.Viewport.Width / 2) - 130, ((int)GraphicsDevice.Viewport.Height / 2) - 40), Color.White);
V tomto kódu je pozice nastavena tak, aby nápis byl víceméně uprostřed obrazovky. Nyní musíme jeho výpis něčím podmínit. Nejlepší by bylo, aby při vyčerpání životů se proměnná GameOver přehodila na true. A v případě, že bude true, tak se vypíše nápis. Nejprve musíme v hlavičce třídy založit proměnnou GameOver typu bool.

bool GameOver = false;

Nyní je potřeba zapodmínkovat náš nápis GameOver.

if (GameOver)

{

spriteBatch.DrawString(spritefontGameOver, "Game Over", new Vector2(((int)GraphicsDevice.Viewport.Width / 2) - 130, ((int)GraphicsDevice.Viewport.Height / 2) - 40), Color.White);

}

A nakonec nastavit hodnotu GameOver na true při hodnotě životů nula.

if (pocetZivotu == 0)

{
GameOver = true;

}

Toto řešení má jeden malý háček. Na pozadí pod nápisem GameOver hra normálně běží dál. Při GameOver by bylo dobré tedy smazat i raketu hráče (tzn. opodmínkovat její vykreslení podobně jako nápis GameOver, ale opačně). Podmínku je třeba nastavit znegovaně.

if (!GameOver)

{

spriteBatch.Draw(raketa, new Vector2(player.posX, player.posY), Color.White);

}

No a to je vše. Máme konec hry. Ještě by to chtělo restart. Při restartu prakticky jen nastavujeme GameOver opět na false, počet životů na tři, resetujeme pozici hráče na obrazovce a vymažeme kolekci s asteroidy. Takže hurá do toho!

Restart hry bychom chtěli provést tlačítkem R. Je jedno, kdy bude zmáčknuté. Klidně i během hry, když si někdo chce zahrát znovu ihned a nemusí tak čekat než prohraje. Tedy v Update metodě uděláme opodmínkovanou akci při stisknutí R a v jejím těle provedeme potřebné kroky, které jsem popisoval výše.

if (Keyboard.GetState().IsKeyDown(Keys.R))

{
asteroidy.RemoveRange(0,asteroidy.Count);
strely.RemoveRange(0, strely.Count);

player.posX = ((int)GraphicsDevice.Viewport.Width / 2) - 50;

player.posY = ((int)GraphicsDevice.Viewport.Height - 116);

pocetZivotu = 3;
GameOver = false;
skore = 0;
}
To je vše. Díky za pozornost!

Všechny předchozí díly seriálu naleznete zde! Seriál je rozdělen na úvod (články 1-5), vývoj 3D hry (6-9) a vývoj 2D hry (10-14).


CGwillWin