# 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:

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