Jednoduchá hra PingPong v C#

C# .NET Objektově orientované programování Zdrojákoviště Jednoduchá hra PingPong v C#

Zde vám ukážu základy, jak si lze jednoduše vytvořit hru v jazyce C#. Nebudete ani potřebovat nějaké rozsáhlé znalosti, žádný speciální software (snad kromě Visual Studia) a dostanete se k dobrému výsledku.

Takže můžeme začít :)

Hra má velice jednoduchý vzhled, v podstatě nemusíme nic složitě malovat. Jednoduše si vystačíme s komponenty, které nám již Visual Studio nabízí.

Za prvé potřebujeme aby jsme měli hru na Celou obrazovku, neměli žádně okraje a nebyl vidět kurzor myši. Toho docílíme třemi řádky kódu.

cursor.Hide();                                  // Schová kurzor
this.FormBorderStyle = FormBorderStyle.None;    // Vymaže okraje Formu
this.Bounds = Screen.PrimaryScreen.Bounds;      // Celá obrazovka

Když to vyzkoušíme tak vidíme, že máme všechno, čeho jsme chtěli docílit. Můžeme tedy jít dál. Jako další potřebujeme samotnou hrací plochu. Do Formu vložíme Panel z Toolboxu, a po vložení vyplníme celý Form pomocí Docku v Properties Panelu. Nyní si vytvoříme pálku a míček pomocí dvou PictureBoxů. Velikosti si dejte, jaké vám vyhovují (já budu mít míček 40x40 a pálku 100x20) a nastavte jim nějakou barvu pozadí (já zvolím míček Červený a pálku černou).

Dále budeme potřebovat Timer, kterým budeme aktualizovat hrací pole a nastavíme Interval na 1 milisekundu. Pak ho po načtení Formu zapneme.

timer1.Enabled = true;  // Zapne Časovač

Pak 2x klikneme na Timer a můžeme zapisovat kód.

První si nastavíme aby se pálka pohybovala pomocí kurzoru myši. Toho docílíme že nastavíme pozici pálky na pozici kurzoru, ale chceme pohybovat jen z leva do prava a naopak, takže pouze osu X. Dále jí přesuneme více ke spodnímu okraji.

palka.Left = Cursor.Position.X - (palka.Width / 2);     // Střed pálky se bude pohybovat po ose X.
palka.Top = playground.Bottom - (playground.Bottom / 10);       // pálka bude u spodního okraje

Nyní si vytvoříme 3 veřejné proměnné. speed_Top, speed_Left, score.

public int speed_top = 3;       // proměná vertikální rychlosti
public int speed_left = 3;      // proměná horizontální rychlosti
public int score = 0;           // proměná dosaženého scóre.

Tak už bychom si mohli míček rozpohybovat. Uděláme to tak že do našeho časovače (Timeru) vložíme následující kód.

micek.Left += speed_left;       // Rozpohybuje míček po ose X.
micek.Top += speed_top;         // Rozpohybuje míček po ose Y.

Když nyní spustíme program, uvidíme, že se míček pohybuje šikmo. To je tím, že "jede" zároveň do prava i dolů. Naší pálkou ovšem jen projede. Ale my potřebujeme, aby se to od pálky odrazilo.

Za prvé musíme míčku říct, kdy se vlastně s pálkou srazil.

if (micek.Bottom >= palka.Top && micek.Bottom <= palka.Bottom && micek.Right >= palka.Left && micek.Right <= palka.Right)       // Nastavíme kdy bude kolize míčku s pálkou
{}

Dále musíme určit, co má míček udělat. Chtěli bychom, aby se odrazil a odražení se je vlastně jen změna směru.

speed_top = -speed_top;         // obrátí směr míčku nahoru

Teď nám lítá míček a dokonce se odráží od pálky. Ale jelikož nemáme spoluhráče tak potřebujeme aby se nám míček odrážel zpět od stěn. Takže si nastavíme kolize se stěnami.

if( micek.Left <= playground.Left)      // Když míček narazí na levou stěnu změní horizontální směr
        speed_left = -speed_left;

if ( micek.Right >= playground.Right)   // Když míček narazí na pravou směru změní horizontální směr
        speed_left = -speed_left;

if ( micek.Top <= playground.Top)       // Když míček narazí na horní stěnu změní vertikální směr
        speed_top = -speed_top;

Už máme skoro funkční hru. Teď když vyzkoušíme, tak to funguje, ale my chceme, aby se hra zastavila, když míček spadne pod pálku - tedy když se dotkne spodní stěny hracího pole. Opět nastavíme kolizi na stěnu. A při kolizi zastavíme časovač, čímž také zastavíme hru.

if (micek.Bottom >= playground.Bottom)
 {
        timer1.Enabled = false;         // Zastavíme časovač
        this.Close();                   // Vypne hru
 }

Nyní když míček skončí pod pálkou, celá hra zastaví a vypne.

To jsou základy. Poté si do hry můžete přidat Skóre, Menu, Obtížnost, různé bloky na ničení atp. Pro ukázku, jak tato hra vůbec pracuje, to ale bohatě stačí :)

Přiložil sem soubor se svou verzí, jak by to mohlo vypadat. Tato hra je tak jednoduchá, že to ani nic víc nepotřebuje :)

Samozřejmě kdyby jste měli nějaké dotazy tak pište a rád poradím, když budu znát odpověď.


Galerie

Hra byla vytvořena v roce 2015.

 

Stáhnout

Staženo 221x (48.3 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (2)

Hru pro vás napsal Paranormal
Avatar
Autor se věnuje programování a webům.

Jak se ti líbí článek?
Celkem (8 hlasů) :
4.1254.1254.1254.125 4.125


 



 

 

Komentáře
Zobrazit starší komentáře (14)

Avatar
nalimleinad
Člen
Avatar
nalimleinad:

Tak nyní funguje v pořádku. :) Jen malé detaily, o které ti nejspíš ani nešlo, když jsi tohle psal a tvým záměrem bylo udělat jen funkční pohyb kostky, jezdec a odrážení od něho a stran. Každopádně jezdec by se mohl zastavit stranou o konec obrazovky, né středem. Kulička by mohla měnit rychlost podle toho, jak dlouho je hra zapnutá, aby z toho bylo alespoň trošku něco záživného a né jen nudné odrážení. A v jako poslední řadě mi přijde, že ta kostka letí takovým sekaným pohybem. Nevím jestli to není jen visuální klam vzhledem k tomu, že je objekt hranatý, každopádně nějak mi to tam nesedí. :-) Neber to jako rýpání, jen mé poznatky a můj názor ze zkoušení tvého výtvoru. ;-)

 
Odpovědět  +2 28.10.2015 9:38
Avatar
Tomáš Brůna
Redaktor
Avatar
Tomáš Brůna:

Ahoj, zkoušel jsem to podle tutoriálu a kostka letí hrozně sekavě, nevíš čím to je?
Zkoušel jsem i jiný sprite ale problém nezmizel :)

Odpovědět  +1 29.10.2015 15:05
Lepší být šprt než blbec :)
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na nalimleinad
Paranormal:

Ahoj, já tenhle návod bral spíš pro začátečníky aby si uměli představit jak to vůbec funguje :) Samozřejmě že by šlo udělat spoustu dalších vylepšení jako bodový systém, zarážky na stěny, různé překážky atd, ale jak říkám tohle je jen na to aby se rozpohybovala kostka a odrážela se :) A ten sekaný pohyb tam je, ale to se mi zdá že je jen kvůli rychlosti vykreslování nové pozice kostky (1 milisekunda). Nejsem si jist jak to vyřešit, ale určitě to nějak jde. Pokud by někdo věděl tak to sem můžete napsat rád se poučím :)

Odpovědět 29.10.2015 20:35
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Paranormal
Tomáš Brůna:

už jsem na to přišel, u timeru se musí zmenšit interval

Odpovědět 29.10.2015 20:40
Lepší být šprt než blbec :)
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na Tomáš Brůna
Paranormal:

Počkat, ale myslím že je tam na Timeru 1 milisekunda, ono jde i míň? :D

Odpovědět  +1 29.10.2015 20:41
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
nalimleinad
Člen
Avatar
nalimleinad:

Jen tak hádám, ale vydělíš jí 1000 ? :D

 
Odpovědět 29.10.2015 20:44
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovídá na Paranormal
Tomáš Brůna:

Já tam měl defaultně 100ms

Odpovědět 29.10.2015 20:51
Lepší být šprt než blbec :)
Avatar
Paranormal
Redaktor
Avatar
Odpovídá na nalimleinad
Paranormal:

Teď nějak nechápu, tu milisekundu ještě tisícem? :D to nevím, ale je to možný :D

Odpovědět 29.10.2015 20:56
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
Avatar
nalimleinad
Člen
Avatar
Odpovídá na Paranormal
nalimleinad:

Přesně tak jsem to myslel, aby jsi z toho měl mikrosekundu :D Ale říkám, jen hádám :P

 
Odpovědět 29.10.2015 20:58
Avatar
Paranormal
Redaktor
Avatar
Odpovědět  +2 29.10.2015 21:01
„Když toho moc neumíme tak jsme na nejlepší pozici se něčemu naučit.“
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 10 zpráv z 24. Zobrazit vše