---
# System prepended metadata

title: Flappy Bird

---

# 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

