Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

4. diel - Hra JellyBox v MonoGame - Logika a Nové želé

V minulom tutoriále o MonoGame sme si do hry pridali strely a triedu pre logiku. V dnešnom diele dorobíme implementáciu triedy Logic, pridáme generovanie želé a vytvoríme nový typ želé.

Textúry

Dnes budeme potrebovať iba jednu textúru pre naše nové želé. Textúru opäť nahráme do zložky Content.

ToxicJelly - Hra JellyBox v MonoGame

Logic & Game1

Teraz si vytvoríme inštanciu triedy Logic v triede Game1 a spustíme našu logiku. Tiež si vytvoríme nový List <Box> a List <Bullet>, pre naše želé a strely.

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

V metóde Initialize si naše Listy inicializujeme.

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

Inicializáciu inštancie triedy Logic vykonáme v metóde LoadContent.

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

Zadali sme všetky potrebné parametre a môžeme pokračovať. Ako posledný krok musíme v metóde Update zavolať našu metódu Update z triedy Logic.

logic.Update(ks, player, gameTime);

Týmto máme logiku dokončenú a môžeme pristúpiť ku generovaniu našich želé.

Generovanie želé

Generovanie želé budeme realizovať aj v triede Game1 a budeme si pre to musieť vytvoriť jednu premennú typu float.

private float boxSpawnTime;

V metóde Initialize nastavíme túto premennú na 0.

boxSpawnTime = 0;

A generovanie vykonáme v metóde Update.

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

Do premennej boxSpawnTime ukladáme aktuálny končiaci k uvedenému dátumu čas hry v sekundách. Akonáhle je čas vyšší ako 2s, tak sa čas vynuluje a pomocou našej metódy v triede Logic náhodne vygenerujeme nový box (želé).

Tu sa veľmi ospravedlňujem, ale je potrebné ešte upraviť triedu Logic, pretože som v predchádzajúcom diele urobil menšie chybičku. Musíme upraviť metódu SpawnBox. Vymastíme všetky jej parametre a na poslednom riadku kde pridávame box do Listu zmeníme názov zb na boxes, čo je lokálne list v triede.

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)));
}

Vykreslenie

To by bolo na ovládanie všetko a teraz už prejdeme k úpravám metódy Draw v triede Game1 a všetko vykreslíme. Skrze cykly foreach, kde prejdeme všetky objekty v liste a pustupně všetky želé, strely 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);

Tiež si ešte vykreslíme zobrazenie skóre, životov, násobenie skóre a počet zjedených želé. Použijeme na to spriteBatch a jeho metódu Drawstring. Pomocou nášho fontu dodáme texte štýl a nastavíme si ľubovoľnú farbu textu tak, aby bola na pozadí vidieť.

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);

Teraz, keď si hru spustíte, tak budú krásne padať želé a vy ich budete môcť zbierať. Akonáhle želé zoberiete, tak sa vám pripočíta skóre.

Toxic Jelly

Teraz si pridáme nový typ želé, ktoré hráč nesmie zobrať, pretože mu inak uberie život. Musí ho zostreliť.

Vytvoríme si novú triedu s názvom ToxicBox a táto trieda bude dediť z triedy Box, pretože bude rovnaká ako Box až na správanie.

class ToxicBox : Box

Vytvoríme si v nej nové premenné. timeCounter, ktorý bude slúžiť ako časovač (bude obsahovať čas), ďalej random, ktorý nám bude generovať náhodné čísla pre pozíciu a ako posledný range, čo bude rozmedzie pre posun. Vytvoríme si konštruktor a nastavíme s ňom naše premenné.

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;
}

Teraz prepíšeme metódu Update od nášho predka Box a vložíme do nej nové správanie. Náš ToxicBox bude mať jednu zaujímavú vlastnosť a to tú, že po určitom čase náhodne poskočí buď doľava, alebo 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 ukladáme aktuálny čas a akonáhle je čas väčší, než 2s, tak prebehne skok. Vytvoríme si 2 premenné pre vymedzenie hraníc skoku, kde zohľadníme hranice obrazovky, aby sa boxu nepodarilo vyskočiť von. Akonáhle máme hranice skoku určené, tak pristúpime k samotnému skoku. Skrze random vyberieme náhodné číslo z nášho rozmedzí ao to číslo náš box posunieme po osi X.

Pozn. maximálna veľkosť skoku je hodnota range, ktorú nastavujeme pri vytvorení novej inštancie, takže každý box môže skákať inak.

Teraz prepíšeme metódu Collision, ktorú máme k dispozícii aj od predka Box. Tu metódu upravíme tak, že ak sa ToxicBox stretne so zemou, tak hráči uberie 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 metódy sme nechali volanie základné metódy Collision od predka a to kvôli tomu, pretože predok má v metóde nastavené, že akonáhle sa box stretne so zemou, tak sa vymaže a takéto správanie chceme aj tu.

Teraz 2 poslednej metódy. Prvá metóda je SetPosition, ktorá nastaví pozíciu objektu a využijeme ju pri generovaní. Druhou metódou je Draw, ktorá klasicky slúži na vykreslenie 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 by sme mali triedu ToxicBox hotovú, ale jej zaradenie do triedy Logic a sprovoznení ich generovanie si necháme na nabudúce, pretože dnes by sme to už celé nestihli.

Dnes sme skončili spolu s krásnym hrateľným výstupom, takže dúfam že sa ďalší diel JellyBoxu páčil a snáď sa mrknete na ďalší diel, kde dokončíme generovanie ToxicBoxu a pridáme ešte jeden nový typ menom SugarBox a ten bude mať naozaj efektné priebeh. Ďalej nás tiež ešte čakajú animácie a menu, takže je na čo sa tešiť.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 161x (1.86 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Hra JellyBox v MonoGame - Strely a Logika
Všetky články v sekcii
Hra JellyBox v MonoGame
Preskočiť článok
(neodporúčame)
Hra JellyBox v MonoGame - Toxic a posledná želé
Článok pre vás napísal Jakub Lásko[Saarix]
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Věnuji se programování v C#, MonoGame a Unity.
Aktivity