4. díl - Hra JellyBox v MonoGame - Logika a Nové želé

C# .NET XNA game studio Hra JellyBox Hra JellyBox v MonoGame - Logika a Nové želé

V minulém tutoriálu o MonoGame jsme si do hry přidali střely a třídu pro logiku. V dnešním díle doděláme implementaci třídy Logic, přidáme generování želé a vytvoříme nový typ želé.

Textury

Dnes budeme potřebovat pouze jednu texturu pro naše nové želé. Texturu opět nahrajeme do složky Content.

ToxicJelly

Logic & Game1

Nyní si vytvoříme instanci třídy Logic ve třídě Game1 a spustíme naši logiku. Také si vytvoříme nový List<Box> a List<Bullet>, pro naše želé a střely.

private Logic logic;
private List<Box> boxes;
private List<Bullet> bullets;

V metodě Initialize si naše Listy inicializujeme.

boxes = new List<Box>();
bullets = new List<Bullet>();

Inicializaci instance třídy Logic provedeme v metodě LoadContent.

logic = new Logic(this, boxes, bullets,
Content.Load<Texture2D>("GreenJelly"),
Content.Load<Texture2D>("BrownJelly"),
Content.Load<Texture2D>("Bullet"));

Zadali jsme všechny potřebné parametry a můžeme pokračovat. Jako poslední krok musíme v metodě Update zavolat naši metodu Update ze třídy Logic.

logic.Update(ks, player, gameTime);

Tímto máme logiku dokončenou a můžeme přistoupit ke generování našich želé.

Generování želé

Generování želé budeme realizovat také ve třídě Game1 a budeme si pro to muset vytvořit jednu proměnnou typu float.

private float boxSpawnTime;

V metodě Initialize nastavíme tuto proměnnou na 0.

boxSpawnTime = 0;

A generování provedeme v metodě Update.

boxSpawnTime += (float)gameTime.ElapsedGameTime.TotalSeconds;
if (boxSpawnTime > 2)
{
        boxSpawnTime = 0;
        logic.SpawnBox();
}

Do proměnné boxSpawnTime ukládáme aktuální uběhlý čas hry v sekundách. Jakmile je čas vyšší než 2s, tak se čas vynuluje a pomocí naší metody ve třídě Logic náhodně vygenerujeme nový box (želé).

Zde se velice omlouvám, ale je třeba ještě upravit třídu Logic, protože jsem v předchozím díle udělal menší chybičku. Musíme upravit metodu SpawnBox. Vymažeme všechny její parametry a na posledním řádku kde přidáváme box do Listu změníme název z b na boxes, což je lokální list ve třídě.

public void SpawnBox()
{
        int t = random.Next(0, textures.Count);
        int x = random.Next(0, (int)game.GetScreenSize().X - textures[t].Width);

        boxes.Add(new Box(textures[t], new Vector2(x, -100)));
}

Vykreslení

To by bylo k ovládání vše a teď už prejdeme k úpravám metody Draw ve třídě Game1 a vše vykreslíme. Skrze cykly foreach, kde projedeme všechny objekty v listu a pustupně všechna želé, střely a fade efekty vykreslíme.

foreach (Box b in boxes)
        b.Draw(spriteBatch);

foreach (Bullet bullet in bullets)
        bullet.Draw(spriteBatch);

// vykreslení grafiky score
foreach (FadeEffect fe in fades)
        fe.Draw(spriteBatch);

Také si ještě vykreslíme zobrazení skóre, životů, násobení skóre a počet snědených želé. Použijeme k tomu spriteBatch a jeho metodu DrawString. Pomocí našeho fontu dodáme textu styl a nastavíme si libovolnou barvu textu tak, aby byla na pozadí vidět.

spriteBatch.DrawString(font, Convert.ToString(score), new Vector2(95, GetGroundRect().Y + 35), Color.DarkRed);
spriteBatch.DrawString(font, Convert.ToString(player.Lives), new Vector2(230, GetGroundRect().Y + 35), Color.DarkRed);
spriteBatch.DrawString(font, Convert.ToString(ScoreMultiply), new Vector2(380, GetGroundRect().Y + 35), Color.DarkRed);
spriteBatch.DrawString(font, Convert.ToString(player.EatedJellies), new Vector2(560, GetGroundRect().Y + 35), Color.DarkRed);

Nyní, když si hru spustíte, tak budou krásně padat želé a vy je budete moci sbírat. Jakmile želé seberete, tak se vám přičte skóre.

Toxic Jelly

Nyní si přidáme nový typ želé, které hráč nesmí sebrat, protože mu jinak ubere život. Musí ho sestřelit.

Vytvoříme si novou třídu s názvem ToxicBox a tato třída bude dědit ze třídy Box, jelikož bude stejná jako Box až na chování.

class ToxicBox : Box

Vytvoříme si v ní nové proměnné. timeCounter, který bude sloužit jako časovač (bude obsahovat čas), dále random, který nám bude generovat náhodné čísla pro pozici a jako poslední range, což bude rozmezí pro posun. Vytvoříme si konstruktor a nastavíme s něm naše proměnné.

private float timeCounter;
private Random random;
private int range;

public ToxicBox(Texture2D texture, Vector2 position, int range)
        : base(texture, position)
{
        timeCounter = 0;
        random = new Random();
        this.range = range;
}

Nyní přepíšeme metodu Update od našeho předka Box a vložíme do ni nové chování. Náš ToxicBox bude mít jednu zajímavou vlastnost a to tu, že po určitém čase náhodně poskočí buď doleva, nebo doprava.

public override void Update(Game1 game, GameTime gameTime)
{
        timeCounter += (float)gameTime.ElapsedGameTime.TotalSeconds;
        if (timeCounter > 2)
        {
                timeCounter = 0;
                int xMin = 0;
                int xMax = 0;

                // výpočet posunu
                if (game.GetScreenSize().X - position.X - texture.Width < range)
                {
                        xMin = -range;
                        xMax = (int)game.GetScreenSize().X - (int)position.X - texture.Width;
                }
                if (position.X - range < 0)
                {
                        xMin = -(int)position.X;
                        xMax = range;
                }
                else if (game.GetScreenSize().X - position.X - texture.Width > range && position.X - range > 0)
                {
                        xMin = -range;
                        xMax = range;
                }

                int x = random.Next(xMin, xMax);
                position = new Vector2(position.X + x, position.Y);
        }

        position.Y += 2;
}

Do timeCounteru si ukládáme aktuální čas a jakmile je čas větší, než 2s, tak proběhne skok. Vytvoříme si 2 proměnné pro vymezení hranic skoku, kde zohledníme hranice obrazovky, aby se boxu nepovedlo vyskočit ven. Jakmile máme hranice skoku určeny, tak přistoupíme k samotnému skoku. Skrze random vybereme náhodné číslo z našeho rozmezí a o to číslo náš box posuneme po ose X.

Pozn. maximální velikost skoku je hodnota range, kterou nastavujeme při vytvoření nové instance, takže každý box může skákat jinak.

Teď přepíšeme metodu Collision, kterou máme k dispozici také od předka Box. Zde metodu upravíme tak, že pokud se ToxicBox střetne se zemí, tak hráči ubere score, život a ScoreMultiply mu nastaví na 1.

public override void Collision(Rectangle ground, Game1 game, Player player)
{
        if (GetRectangle().Intersects(ground) && !Delete)
        {
                game.AddScore(-5, new Vector2(position.X + texture.Width / 2, position.Y + texture.Height / 2));
                player.Lives--;
                game.ScoreMultiply = 1;
        }

        base.Collision(ground, game, player);
}

Na konci metody jsme nechali volání základní metody Collision od předka a to kvůli tomu, protože předek má v metodě nastaveno, že jakmile se box střetne se zemí, tak se vymaže a takovéto chování chceme i zde.

Nyní 2 poslední metody. První metodou je SetPosition, která nastaví pozici objektu a využijeme ji při generování. Druhou metodou je Draw, která klasicky slouží k vykreslení objektu.

public void SetPosition(int x, int y)
{
        position = new Vector2(x, y);
}

public override void Draw(SpriteBatch spriteBatch)
{
        spriteBatch.Draw(texture, position, Color.White);
}

Tímto bychom měli třídu ToxicBox hotovou, ale její zařazení do třídy Logic a sprovoznení jejich generování si necháme na příště, protože dnes by jsme to už celé nestihli.

Dnes jsme skončili spolu s krásným hratelným výstupem, takže doufám že se další díl JellyBoxu líbil a snad se mrknete na další díl, kde dokončíme generování ToxicBoxu a přidáme ještě jeden nový typ jménem SugarBox a ten bude mít opravdu efektní průběh. Dále nás také ještě čekají animace a menu, takže je na co se těšit.


 

Stáhnout

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

 

  Aktivity (1)

Článek pro vás napsal Jakub Lásko[Saarix]
Avatar
Věnuji se programování v C#, MonoGame a Unity.

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


 



 

 

Komentáře

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Tak jsem si to zahrál, vypadá to nadějně :)

Odpovědět 5.11.2013 18:44
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Jakub Lásko[Saarix]:

Děkuji :-) V tom případě hned zítra už napíšu další díl.

Odpovědět 5.11.2013 19:19
Časem je vše možné.
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 2 zpráv z 2.