# Flappy Bird Ahoj kluci, dnes budeme programovat Flappy Bird. Jestli vám to bude vyhovovat řiďte se tímto návodem. Ne všechno tu budete mít napsané, ale mohl by vám pomoct :) Pokud byste náhodou hru _Flappy Bird_ nezanli můžete si ji rychle vyzkoušet [zde](https://flappybird.io). Herní mechanika je pomerně jednoduchá. Ptáček, skáče na zmáčknutí mezerníku a umře pokud narazí na překážku. --- ## Jak začít Začněte tím, že si založíte nový _WindowsForms_ program. Pojmenujte ho FlappyBird. Budeme používat třídy, v tomto případě se nám budou hodit dvě, třída `Bird` a třída `Prekazka`. (Nová třída se vytvoří kliknutím v průzkumníku řešení na `FlappyBird` pravým tlačítkem, dále `Přidat` > `Nový`, vyberte položku `Třída`, pojmenujte a přidejte) Pak dvakrát klikněte do Formu, tím se vám otevře kód. ## Ptáček - `Bird` Třída `Bird` bude dědit od `PictureBoxu`, to znamená, že bude umět všechny věci jako `PictureBox` + ty věci, které tam přidáte. Dělá se to přidáním dvojtečky a třídy, od které má dědit. `Class Bird : PictureBox` - aby to fungovalo, bude pravděpodobně muset nahoru přidat `using System.Drawing` <br> Co bude `Bird` umět? - bude vědět jestli zrovna skáče nebo ne - bude mít v sobě funkci `Pohyb` ### `Pohyb` Pokud ptáček skáče, bude ho posouvat nahoru (pouze do určité vzdálenosti), jinak ho bude posouvat dolu. To nám bude prozatím stačit. Kdo bude chtít může si později funkci `Pohyb` předělat tak, aby při výskoku nahoru ptáček zpomaloval a při pádu dolu zrychloval. ## Překážka - `Prekazka` Překážka je tvořena dvěma obdelníky jeden zezdola, druhý zespoda. Mezi nimi je mezera, která je veliká jako konstanta `velikostMezery`. Naše třída `Prekazka` bude proto mít dva `PictureBox` - `horni` a `dolni`. Nejlepší bude je vytvářet ve `Form` a předávat je jako parametr konstruktoru. Co dalšího bude překážka umět? - funkci která bude překátky pohybovat doprava (Jaká souřadnice se bude měnit?) - funkci, která kontroluje, jestli překážka vyjela mimo hrací pole. (Pak musí být ve `Formu` odebrána z listu) ```Csharp Prekazky.RemoveAt(indexPrekazkyKOdebrani) ``` - funkci, která bude kontrolovat kolizi s ptáčkem, viz. Kolize ### Kolize Kolize dvou obdelníků nastává pokud: - pravá hrana obdelníku1 je napravo od levé hrany obdelníku2 - levá hrana obdelníku1 je nalevo od pravé hrany obdelníku2 - pokud spodní hrana obdelníku1 je pod horní hranou obdelníku2 - pokud horní hrana obdelníku1 je nad spodní hranou obdelníku2 Není to úplně jednduché na pochopení. Zkuste se podívat na tento obrázek: ![kolize obdelniku](http://jeffreythompson.org/collision-detection/images/rect-rect.jpg) Kdyby náhodou ani toto nepomohlo, můžete použít funkci definovaou microsoftem. :D ```Csharp pictureBox1.Bounds.IntersectsWith(pictureBox2.Bounds) ``` Která vrátí `true` pokud jsou v kolizi. ## Form Globální proměné: - `Bird bird` - `List<Prekazka> Prekazky = new List<Prekazak>()` - `int velikostMezery` - může to být konstanta (přidáním klíčového slova `const`) Co se bud dít ve Formu: - na začátku programu se vytvoří se nový ptáček a postupně se vytovří 3 překážky, pomocí funkce `PridatPrekazku` viz níže - form bude čekat na zmáčknutí mezerníku, při kterém, ptáček, pokud neskáče, poskočí nahoru. (Funkce `Form1_KeyDown` se vytvoří pokud ve `Vlastnosti` kliknete na blesk (události) a dvakrát na ni kliknete.) - `Timer_Tick`, který bude pousouvat překážky doleva, a ptáčka nahoru, nebo dolu. Tento timer se bude muset zastavit až ptáček narazí do překážky ### `PridatPrekazku` V této funkci se vytvoří dva PictureBoxy, které se pak předají při vytvoření nové překážky. Tyto PictureBoxy by mezi sebou měly mít mezeru velikou jako `velikostMezery`. Kdo se odváží může to zkusit sám. Pokud byste uvítali pomoc inspirujte se tímto: ```Csharp private void PridatPrekazku() { int nahodnaMezera = rnd.Next(0, this.Size.Height - velikostMezery); PictureBox horni = new PictureBox(); PictureBox dolni = new PictureBox(); horni.Location = new Point(this.Size.Width, 0); horni.Size = new Size(30, nahodnaMezera); dolni.Location = new Point(this.Size.Width, nahodnaMezera + velikostMezery); dolni.Size = new Size(30, this.Size.Height - nahodnaMezera - velikostMezery); horni.BackColor = Color.Orange; dolni.BackColor = Color.Orange; Controls.Add(horni); Controls.Add(dolni); prekazky.Add(new Prekazka(horni, dolni)); } ``` ## Konec To co jste si teď dočetli můžete použít jako kostru vašeho programu. Každopádně neváhejte se nás na cokoliv zeptat. Pokud byste měli náhodou vše hotové, do programu přidejte: - nakreslete si vlastního ptáčka a použijte ho - upravte skok, aby se vypadal více reálně, tj. při výskoku ptáček zpomaluje, při pádu zrychluje - počítejte a vypisujte skóre - udělejte obrazovku, která se zapne až hráč prohraje - pokud hráč prohrál a zmáčkl mezerník, začne hrát znovu ... a to by snad mohlo stačit :D