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

Vývoj her v XNA #11: 2D hra s raketkou #2
Vývoj her v XNA #11: 2D hra s raketkou #2
13:17, 03.03.2011

V minulém díle jsme si předvedli, jak pohybovat s raketou, která je vykreslena pomocí vlastní třídy GameObject. Na stejném principu budeme i střílet naše náboje. Jednoduše budeme tvořit objekty po stisku mezerníku na místě, kde je naše raketa. Dále budeme tyto objekty uchovávat v kolekci a vždy je jedním cyklem všechny posuneme o pár pixelů nahoru, aby letěly dopředu.

V první řadě budeme potřebovat texturu střely. Opět jsem něco vyplodil. Myslím, že střela o rozměrech 4x4 pixelu nám bude bohatě stačit.

Klik pro zvětšení (Vývoj her v XNA #11: 2D hra s raketkou #2)
Dáme ji tedy do našeho projektu a napíšeme si prvních pár řádků. V první řadě budeme potřebovat kolekci. Bude nám stačit kolekce generická s názvem List. Generické kolekce byste měli mít už ve svém projektu zanesené.

Vytvoříme tedy takovou kolekci na místě, kde si ve hře necháváme všechny proměnné:

List<GameObject> strely = new List<GameObject>(); 
Nyní musíme také zanést do hry texturu naší střely. Takže vytvoříme ještě proměnnou pro střelu.

Texture2D strela;
Tu následně naplníme v LoadContent metodě.

strela = Content.Load<Texture2D>("strela");
Teď musíme po stisku klávesy mezerník zajistit vytvoření nové instance třídy GameObject s texturou střely na místě naší rakety. Uděláme to ještě trošku frikulínsky. Přičteme hodnotě posX vzdálenost poloviny textury naší rakety. Tím zajistíme, že střely se budou objevovat přímo před hlavní rakety.

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

{

strely.Add(new GameObject(player.posX + (raketa.Width / 2), player.posY));

}


Vytvořili jsme tím novou instanci třídy. Nyní musíme všechny položky v seznamu střely vykreslovat, abychom je viděli. Provedeme tedy zápis do metody Draw. Nejlepší bude to provést pro všechny položky v seznamu. K tomu se výborně hodí cyklus Foreach. Použit je asi následovně.

foreach(GameObject fire in strely)

{

spriteBatch.Draw(strela, new Vector2(fire.posX, fire.posY), Color.White);

}

Máme skoro všechno hotovo. :) Nyní už jen detail. Musíme také říct, že se všechny střely budou pohybovat nahoru. To je strašně jednoduché. Podobný Foreach cyklus zavedeme do metody Update. Jediné, co bude dělat, je zmenšovat pozici Y.

foreach (GameObject fire in strely)

{

fire.posY -= gameTime.ElapsedGameTime.TotalMilliseconds * 0.35f;

}

Nicméně, pokud jste pozorní, tak jste si všimli, že to zapisuji jinak než pohyb hráčovi raketky. Problém je v jednom... FPS. Zjednodušeně počet snímků za sekundu by ovlivňoval rychlost naší hry. Vlastnost TotalMilliseconds, na kterou se dotazujeme gameTime.ElapsedGameTime.TotalMilliseconds nám zjišťuje, kolik milisekund uběhlo od vykreslení předchozího snímku. A pak už tuto hodnotu násobíme nějakou konstantou. Díky tomu hra bude probíhat stejně rychle, i když bude snímků za vteřinu pět a nebo dvacetpět. :)

Jistě vám neuniklo, že by bylo vhodné to zapsat i pro pohyb hráče. Nový kód tedy bude vypadat takto:

if (Keyboard.GetState().IsKeyDown(Keys.Right) && (player.posX < ((Int32)GraphicsDevice.Viewport.Width - 100)))

{

player.posX += (int)(gameTime.ElapsedGameTime.TotalMilliseconds * 0.35f);

}

if (Keyboard.GetState().IsKeyDown(Keys.Left) && player.posX > 0)

{

player.posX -= (int)(gameTime.ElapsedGameTime.TotalMilliseconds * 0.35f);

}

if (Keyboard.GetState().IsKeyDown(Keys.Up) && (player.posY > 0))

{

player.posY -= (int)(gameTime.ElapsedGameTime.TotalMilliseconds * 0.35f);

}

if (Keyboard.GetState().IsKeyDown(Keys.Down) && (player.posY < (Int32)GraphicsDevice.Viewport.Height - 116))

{

player.posY += (int)(gameTime.ElapsedGameTime.TotalMilliseconds * 0.35f);

}

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

{

strely.Add(new GameObject(player.posX + (raketa.Width / 2), player.posY));

}

Aby to vypadalo všechno graficky ještě lépe, měli bychom konečně dát také texturu na pozadí. Připravil jsem si pro vás texturu vesmíru.

Klik pro zvětšení (Vývoj her v XNA #11: 2D hra s raketkou #2)

Nahrajeme ji do Content a uděláme to, nač jsme už zvyklí. Vytvoříme textuře proměnnou a tu začneme vykreslovat. Nesmíme zapomenout vykreslovat tuto texturu jako první, aby byla vespod.

Vytvoříme tedy proměnnou

Texture2D space;

Nahrajeme do ní obrázek textury.

space = Content.Load<Texture2D>("space");

A ten vykreslíme.

spriteBatch.Draw(space, Vector2.Zero, Color.White);

OK. Dnes jsme si ukázali, jak se dá střílet. Střely si pohybují kupředu. Příště si budeme vykreslovat asteroidy a budeme zjišťovat kolizi objektů, a pokud ke kolizi dojde, tak objekty mazat. :)

Klik pro zvětšení (Vývoj her v XNA #11: 2D hra s raketkou #2)


CGwillWin